Java并发编程实战学习笔记 第二章 线程安全性

要编写线程安全的代码,其核心在于要对访操作进行管理,特别是对共享的和可变的状态访问。共享意味着变量可由多个线程同时访问,而可变意味着变量的值在器生命周期中可以发生变化。一个对象是否安全,取决于他书否被多个线程访问。当多个线程访问某个转台变量并且其中有一个线程是写入操作时,必须采用线程协同对变量进行访问。

1、什么是线程安全

当线程访问某个类时,这个类始终能够表现出正确的行为,那么就称这个类是线程安全的。无状态对象一定是线程安全的。大多数selvet都是无状态的,所从而极大地降低了在实现servlet线程安全时的复杂性。

2、原子性

当在无状态的对象中增加一个状态,如:在serlvet中增加一个计数器,用于记录访问的数量,这时候,变量不是原子性的:分为  读取-修改-写入 操作,并且其结果依赖于之前的状态,就会出现记录数值出现偏差,从而是不安全的。

2.1 竞态条件

在线程不安全中存在多个静态条件,从而使结果变得不可靠。最常见的竞态条件类型是:先检查后执行操作,通过一个可能失效的结果来决定下一步的动作。

延迟初始化中的竞态条件:如:放一个类中初始化某个类,而是初始化并返回这个类的方法中,首先判断这个了是否为null ,如果为null,则初始化返回,这时,如果并发线程A、B,B在进行获取时,取决于A获取类的时间以及线程的调度方式,就会出现不同的结果。

在上述问题中,可以采用线程安全的类来避免并发造成的线程不安全问题。能够保证所有对状态操作都是原子性的。

2.3 加锁机制

1.内置锁:同步代码块,分为两部分,一个作为锁的对象引用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值