java并发实战读书笔记

来源:互联网 发布:krpano100源码 授权码 编辑:程序博客网 时间:2024/05/23 19:24

第三章关于对象共享

java并发实战第三章主要讲述关于对象共享的问题

如下:

一.失效数据:

失效数据可能不会同时出现:一个线程可能获取一个新值另一个线程可能获得一个已经失效的值。失效数据可能导致活跃性问题和安全性问题

为了解决失效数据我们可以对变量的get和set方法进行同步。

二.最低安全性:

线程没有同步的情况下读取变量,可能得到一个失效值,但是这个值可以使有之前某个线程设置的值,这样的安全保证被称为最低安全性。

三.非原子的64位操作:

对于非volatile类型的long和double变量,jvm允许将64位读操作或写操作分解为两个32位的操作。读取一个volatile类型的long变量,读写操作如果在不同的线程中执行,有可能发生读取一个值的高32位和另一个值得低32位。因此共享long和double变量应该使用volatile关键字保证可见性。

四加锁与可见性:

加锁不仅保证了互斥行为,还保证了内存可见性,为保证可见性,所有执行读操作或者写操作的线程都必须在同一个锁上做同步。

volatile变量(重点内容,面试经常会被问的多线程知识之一,感觉本书介绍的很详细):

volatile变量是一种稍弱的同步机制,确保将变量的更新操作通知到其他线程(可见性),声明为volatile后建议与运行时都会注意这个变量是共享的,因此不会把该变量操作与其他内存操作一起重排序(不了解什么是重排序(╯‵□′)╯︵┻━┻),因为访问volatile变量不会执行加锁操作因此不会使线程阻塞,从内存角度来说写入volatile变量相当于退出同步代码块,读取操作相当于进入同步代码块。使用volatile变量时应该注意:1.对变量的写入操作不依赖变量的当前值,或者确保只有单个线程更新变量值2.该变量不会与其他变量一起纳入不变形条件中(不太懂什么意思=.=)3.访问变量时不需要加锁

五发布与逸出


关于共享对象破坏类的封装性

六ad-hoc线程封闭

线程的封闭性完全由程序实现来承担,存在脆弱性

七栈封闭

只能局部变量访问对象

八ThreadLocal

使线程中的某个值与保存值得对象连接起来,常用于对可变的单实例变量或全局变量进行共享,如果需要将一个单线程程序一直到多线程环境,通过将全局变量转化为

ThreadLocal对象,可以维持线程安全性,如果将应用程序范围的缓存设置为线程的局部缓存name不会有 



原创粉丝点击