java线程学习(2)

来源:互联网 发布:知名度最高的软件学校 编辑:程序博客网 时间:2024/06/16 23:02

可见性:当一个线程对对象进行状态修改时,其他线程能过确实的看到修改的发生。(相同的锁是可见性的保证)

过期数据:由于数据缺少可见性,线程A的写入操作线程B无法看见,故线程B读取的是过期数据。

读取一个volatile修饰的变量时,总会返回一个由某线程写入的最新的值,然而volatile变量的操作不会枷锁,显然也不会造成阻塞,使得其对于synchronized来说是一种轻量级的同步机制

当验证正确性必须推断其可见性时,应避免volatile,正确使用volatile的情况:标识重要事件的生命周期,确保某一对象引用的可见性

在单个线程中,只要重排序不会对结果产生影响,程序就不一定会按照写定的顺序执行,即使重排序对其他线程造成严重影响

最低限的安全性:该值是某哥线程写入的值,而不是凭空产生的值,这样的保证就是最低性安全性(除了没有声明为volatile的long和double类型,其他都具有最低安全性)

发布一个对象:指一个对象能被除当前范围以外的代码使用

发布对象的方式:将对象储存到静态域,在一个非私有的方法中返回这个引用,发布一个内部类实例(内部类实例包含了外部类this的引用,使用工厂模式防止this在构造器期间逸出  待定= =||)

线程限制:当对象封闭在一个线程中时,他是线程安全的

例子:应用池化的JDBCconnector对象,线程从池中获取一个connection,在线程使用完connection并返回之前,池不会将这个connection给其他人,即connection对象被限制在处理请求的线程中

栈限制,只有本地变量才可以访问对象。

threadlocal:为每一个线程创建一个副本,所以get返回的总算最新set的值




用final修饰引用不可变,来保证其他其他线程不会修改其引用,如果要更新值,那就由某一线程创建新的对象,通过volatile来保证对象的可见性,使得其他线程能够及时看见最新被创建的对象。某种程度上取代了锁(锁的互斥性和可见性在这里都被取代了)

不正常发布会导致局部创建对象,表现为在其他线程中看到的状态不一致,罪魁祸首还是可见性

安全发布的模式:

1:通过静态初始化器初始化对象的引用(由于jvm内在的同步,这种方式的同步能够安全发布)

2:将其引用存入volatile域或者atomicReference域

3:将引用存入正确创建的对象的final域

4:将引用存入由锁正确保护的域中

不可变对象是线程安全的。(final修饰的变量代表引用不可变,并不代表所指向的对象不可变),可以任意发布

有效不可变对象:一个对象在发布后其状态不会发生改变(对象在技术上永远是可变的),必须要安全发布

可变对象:在安全发布的同时还要保证线程安全

0 0
原创粉丝点击