====不可变对象定义:====
1,对象创建后其状态不能修改
2,对象所有域都是final的
3,对象时正确创建的,在对象构造期间,this引用没有逸出
====安全发布对象的含义:====
确保使用对象的线程能够看到该对象处于已发布的状态,是对象的状态呈现一致性视图。
安全发布对象的常用模式:
可变对象必须通过安全的方式来发布,通常意味着发布和使用该对象的线程都必须使用同步
一个正确构造的对象可以通过以下方式来安全发布:
* 在静态初始化函数中初始化一个对象引用
* 将对象引用保存到volatile类型域或者AtomicReference对象中
* 将对象引用保存到某个正确构造函数对象的final类型域中
* 将对象引用保存到一个由锁保护的域中,这个常见的就是保存到线程安全的容器中比如Vector或SynchronizedList等等
线程安全的容器类:
1,将一个键/值放入Hashtable、SynchronizedMap、ConcurrentMap中,可安全将它发布给任何从这些容器中访问它的线程。
2,将某个元素放入Vector、CopyOnWriteArrayList、CopyOnWriteArraySet、SynchronizedList、SynchronizedSet中
3,将某个元素放入BlockingQueue、ConcurrentLinkedQueue中
4,其他比如Future和Exchanger等,也能安全发布对象。
通常,要发布一个静态构造的函数,最简单和最安全的做法是使用静态的初始化器,这个在JVM里面有同步保证。
public static Holder holder = new Holder(42);
====事实不可变对象====
如果对象从技术上看是可以变的,但其状态在发布后就不会再改变,那么把这种现象称为事实不可变对象 Effectively Immutable Object。比如要保存每位用户的最近登录时间Date类型,原则上可以修改Date,但业务上初始化后就不会了,那么使用SynchronizedMap就足够了,里面的安全机制可确保Date会被安全的发布。放入后不会改变那就可以了。
对象的发布需求取决于它的可变性:
1,不可变对象可以通过任意机制来发布
2,事实不可变对象必须通过安全方式发布
3,可变对象必须通过安全方式发布,并且必须是线程安全的或者由某个锁保护起来。
在并发程序中使用和共享对象时,可以使用一些实用策略,包括:
线程封闭:
线程封闭的对象只能由一个线程拥有,对象被封闭在该线程中,并且只能由这个线程修改。
只读共享:
在没有额外同步情况下,共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它。包括不可变对象和事实不可变对象。
线程安全共享:
线程安全的对象在其内部实现同步,因此多个线程可以通过对象的公有接口进行访问而不需要进一步的同步。
保护对象:
被保护对象只能通过持有特点锁来访问。保护对象包括封装在其他线程安全对象中的对象,比如SynchronizedMap中的对象,以及已发布的并且由某个特定锁保护的对象。
本人博客已搬家,新地址为:http://yidao620c.github.io/
相关推荐
《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...
根据提供的信息,“Java 并发编程实战.pdf”这本书聚焦于Java并发编程的实践与应用,旨在帮助读者深入了解并掌握...无论是对于初学者还是有一定经验的开发者来说,《Java并发编程实战》都是一本值得深入学习的好书。
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...
《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...
《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...
在Java并发编程中,多线程是核心概念之一。多线程允许程序同时执行多个任务,从而充分利用系统资源,提高程序性能。然而,多线程编程也带来了同步和竞态条件等问题,这需要开发者具备良好的线程管理和同步机制的知识...
#### 一、Java并发概述 自Java诞生之初,其设计者就赋予了该语言强大的并发处理能力。Java语言内置了对线程和锁的支持,这使得开发者能够轻松地编写多线程应用程序。本文旨在帮助Java开发者深入理解并发的核心概念...
锁机制是Java并发编程中的另一大主题,包括内置锁(互斥锁)和显式锁(如`ReentrantLock`)。内置锁是`synchronized`关键字提供的,而显式锁提供了更细粒度的控制和更丰富的功能。书中可能还会讨论读写锁(`...
《Java并发编程:设计原则与模式(第二版)》是一本深入探讨Java多线程编程技术的权威著作。这本书详细阐述了在Java平台中进行高效并发处理的关键概念、设计原则和实用模式。以下是对该书内容的一些核心知识点的概述...
Java并发编程是软件开发中的一个关键领域,尤其是在大型企业级应用和分布式系统中。通过学习相关的书籍,开发者可以深入理解如何有效地设计和实现高效的多线程应用程序,避免并发问题,如竞态条件、死锁、活锁等。...
这份“java并发编程内部分享PPT”显然是一个深入探讨这一主题的资料,旨在帮助开发者理解并掌握Java并发编程的核心概念和技术。 在Java并发编程中,首先我们需要了解的基本概念是线程。线程是操作系统分配CPU时间的...
Java并发编程实践是Java开发中不可或缺的一个领域,它涉及到如何高效、正确地处理多线程环境中的任务。这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的...
《Java 并发编程实战》是一本专注于Java并发编程的权威指南,对于任何希望深入了解Java多线程和并发控制机制的开发者来说,都是不可或缺的参考资料。这本书深入浅出地介绍了如何在Java环境中有效地管理和控制并发...
Java并发编程是Java开发者必须掌握的关键技能之一,它涉及到如何在多线程环境中高效、安全地执行程序。并发编程能够充分利用多核处理器的计算能力,提高应用程序的响应速度和整体性能。《Java编程并发实战》这本书是...
《Java并发编程:设计原则与模式(第二版)》是一本深入探讨Java平台上的多线程和并发编程的著作。本书旨在帮助开发者理解和掌握在Java环境中进行高效并发处理的关键技术与设计模式。以下是对该书内容的一些核心知识...
本资料“Java并发编程设计原则和模式”深入探讨了如何在Java环境中有效地进行并发处理,以充分利用系统资源并避免潜在的并发问题。 一、并发编程基础 并发是指两个或多个操作在同一时间段内执行,但并不意味着这些...
### Java并发编程实践 #### 一、并发编程基础 ##### 1.1 并发与并行的区别 在Java并发编程中,首先需要理解“并发”(Concurrency)和“并行”(Parallelism)的区别。“并发”指的是多个任务在同一时间段内交替...
第3章 对象的共享 3.1 可见性 3.1.1 失效数据 3.1.2 非原子的64位操作 3.1.3 加锁与可见性 3.1.4 Volatile变量 3.2 发布与逸出 3.3 线程封闭 3.3.1 Ad-hoc线程封闭 3.3.2 栈封闭 3.3.3 ThreadLocal类 ...