java并发编程实战极客_学习java并发实战编程(一)线程安全性

什么是线程的安全性

文中原话的对于其正确性的描述:某个类的行为和其规范完全一致。在良好的规范中通常会定义各种不变性的条件来约束对象的状态,以及定义各种后验状态来描述对象操作的结果

我对这句话也是一脸懵逼,好吧自己总结一下吧。。我更想按书中的竞太条件来说明,,可以将java的所有操作都看做是依赖于对象的某个状态,因为多线程的原因,使得这个状态在操作前可能出现多个状态,而我们需要的正确状态只能依靠于运气去获取,显然一种非常不安全的行为

public class LazyInitRace{

private ExpensiveObject instance=null;

public ExpensiveOBject getInstance(){

if(instance ==null)

instance =new ExpensiveObject();

return instance

}

}这是书中的一段代码 ,,在平时的业务 感觉上市没有任何问题的,但是在多线程中,如果有A,B两个线程同时访问了这个方法,并且A正好执行到instance=new ExpensiveObject();而线程B却执行到了if(instance=null),很明显这是A正在为instance创建实例 ,而B却认为instance没有创建实例 我应该去创建一个,那这是返回的instance就会有两个一个是A创建的一个是B创建的,明明说好的是单列呢,到了多线程中就成为了多例。也正是应为instance=new

ExpensiveOBject()的创建依赖了instance之前的状态是null。而多线就会造成instance在判断是时候为null,而在执行时却已经创建,在其中的状态已经被悄悄的替换了。。所以我们在多线程编程的应当避免竞态条件的出现

可以用java本身自带的锁机制实现将代码该成如下即可

public class LazyInitRace{

private ExpensiveObject instance=null;

public synchronized ExpensiveOBject getInstance(){

if(instance ==null)

instance =new ExpensiveObject();

return instance

}

}强制将此方法进行同步,也可以说是将此方法变成一个原子性的操作不可分割,而在方法上进行同步则是利用到了java本身的内置锁机制,锁是LazyInitRace本身锁持有的锁,也正是应该讲方法进行原子化得处理使得多线程在访问该方法时会应该一个线程的原子操作为完成而等待该原子操作的完成,在这个时刻线程是无法做任何其他的事情,就会出现活性的问题,

总结:书中这章主要讲了线程安全性出现的原因,如何在方法层面上处理线程安全(java锁机制),对于锁机制可能带来了一个问题进行简单的概述(活跃性和性能上的问题),当然必不可少的还有死锁

标签:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值