不可变对象(Immutable Objects)即对象一旦被创建它的状态(对象的数据,也就是对象属性值)就不能改变,反之即为可变对象(Mutable Objects)。
不可变对象的类即为不可变类(Immutable class)。Java平台类库中包含许多不可变类,如String、基本类型的包装类、BigInteger和BigDecimal等。不可变对象天生是线程安全的。它们的常量(域)是在构造函数中创建的。既然它们的状态无法改变,这些常量无法不会变。
不可变对象永远是线程安全的。
只有满足如下状态,一个对象才是不可变的:
1.它的状态不能在创建后修改;
2.所有域都是final类型;
3.它被正确创建(创建期间没有发生this引用的溢出)。
什么是并发容器的实现?
何为同步容器:可以简单理解为通过synchronized来实现同步的容器,如果有多个线程调用同步容器的方法,它们将会串行执行。比如Voctor,Hashtable,以及Collectons.synchronizedSet,synchronizedList等方法返回的容器。可以通过查看Vector,hashtable等这些同步容器的上线代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,并在需要同步的方法上加上关键字synchronized。
并发容器使用了与同步容器完全不同的加锁策略来提供更高的并发性和伸缩性,例如在ConcurrentHashMap中采用了一种颗粒度更细的加锁机制,可以成为分段锁,在这种锁机制下,允许任意数量的读取线程并发访问map,并且执行读操作的线程和写操作的线程也可以并发的访问map,同时允许一定数量的写操作线程并发地修改map,所以它可以再并发环境下实现更高的吞吐量。