码迷,mamicode.com
首页 > 编程语言 > 详细

Java并发编程(八)不变性

时间:2017-12-09 12:01:35      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:编程   修改   不一致   规范   防止   多线程   丢失   不可变对象   共享   

 

提到不变性我首先想到的就是String这个类了。

 

之前学习了很多原子性以及可见性的问题:失效数据,丢失更新操作或者某个对象的状态不一致,都与多线程试图访问同一个可变的相关。

 

如果对象的状态不会发生改变,那么这些问题与复杂性也就自然消失了。

 

如果某个对象在被创建之后其状态就不能被改变,那么这个对象就称为不可变对象。

 

不可变对象一定是线程安全的。

 

不可变对象很简单,它们只有一种状态,并且该状态由构造函数来控制的。

 

1. 不可变对象的状态容易判断

2. 不可信的代码访问不可变对象不会改变其状态,防止留下引用在其他线程中修改

3. 不可变对象可以安全地共享和发布,而不需要保存副本

 

java语言规范并没有给出不可变性的正式定义,不可变性并不等同于给属性加上final修饰。

即使都用final修饰,带对象也不见得是不可变的,因为final类型的域中可以保存对可变对象的引用。

 

满足一下条件时,对象才是不可变的:

1. 对象一经创建便不可修改

2. 对象所有的域都是final类型

3. 对象是正确创建的(在创建的时候this没有逸出)

 

不可变对象只是外部不可以改变其状态,内部还是可以维护的。

在可变对象之上构建不可变对象。

 

String类型指向的字符串可以修改么?

 

 

final类型

 

 

 

volatile来发布不可变对象

Java并发编程(八)不变性

标签:编程   修改   不一致   规范   防止   多线程   丢失   不可变对象   共享   

原文地址:http://www.cnblogs.com/tuhooo/p/8010751.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!