synchronize原理以及和CAS的浅层比较

1.为什么需要synchronize

我自己的理解(问题):当多个线程对同一个对象M进行操作的时候,如果是非原子性对象(比如a++这样的,要分好几个指令来走),A线程处理该对象M的时候,很可能会出现在执行完某个指令之后,因为被分配到cpu时间片段用完了,只能等待再次被分配时间片段,而这时,其他线程(线程B)对该对象进行了操作,导致对象M的值不一样了,之后由于A线程被分配到了时间片段,所以可以继续执行未处理完的指令,但是它很傻,不会在处理前看看对象M是否已经变了,而是继续按照之前拿到值进行操作。

我自己的理解(处理):两种方式 ①在对象M上加一个判断,使得线程A在处理该数据的时候,会去拿最新的值与原值进行比较,如果没有人动过,那就继续完成其它指令。

                                                       ②加上一个保护,我没有完成一系列的指令前,谁都不能动,直到我完成了相关指令,其它线程才能对其进行处理。这样可以保证其原子性。

我自己的理解(具体实现):①咱们可以用CAS(compare and swap)来进行

//声明
private static AtomicInteger count=new AtomicInteger(0);
//使用 自增
cout.incrementAndGet();
//使用 自减
cout.decrementAndGet();

②可以用synchronize来实现原子性

//想要哪一快保持原子性,就把那一块用中括号括起来
synchronized(this){
    a++
}
//静态方法需要的是类锁,所以需要.class对象的锁
synchronized(b.class){
a++
}

当然也可以用lock来锁,这个是程序员自己整的,也能保持原子性,但是呢,要注意不能加上try语块,免得出现异常,出现了死锁

//声明一把可重入锁
private ReentrantLock lock=new ReentrantLock();
//上锁
lock.lock();
try{
a++
}finally{
//释放锁
lock.unlock;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值