java并发实战读书笔记

第三章关于对象共享

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不会有 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值