03-尽可能使用不可变对象
11.2 尽可能使用不可变对象
在Java中,以面向对象的方式开发应用时,我们会创建一些由属性和方法组成的类。这些方法决定了能用类执行的操作。而属性则存储了用于定义对象的数据。通常,在每个类中都会实现一些方法来设置属性的值。随着应用程序的运行,当需要修改对象时,就可以使用这些方法来修改对象的属性值。
在开发一个并发应用程序时,需要特别注意多线程共享的对象。必须采取同步机制来保护这些对象的访问。否则,很可能在应用程序中出现数据不一致的问题。
开发并发程序时,可以实现一种特殊对象,即 不可变对象 (immutable)。这种对象的特性是创建后无法修改的。如果要修改不可变对象,则必须创建一个新对象,并将老对象中要修改的值设置到新对象中。
在并发应用中,该机制具有如下优势。
- 因为一旦创建了这种对象,就无法由任何线程来修改,所以不需要使用同步机制来保护对其属性的访问。
- 因为它不会产生数据不一致的问题(这种对象的属性是无法修改的),所以每次访问所产生的数据副本都是一致的。
这种方式的唯一缺点就是开销:它以创建新对象的方式替代了对老对象的修改。
Java提供了一些不可变类,比如 String
类。在为一个存在的 String
对象指定新值时,并不是修改了旧值,而是新建了一个 String
对象。例如,如下代码在第二行里,JVM创建了一个新的 String
对象。
String var = "hello";
var = "new";