6-27小记

第三讲-互斥锁(上),解决原子性问题

引出问题:

       导致原子性原因是线程切换,禁止线程切换,这个问题不就解决了吗?

       单核CPU,禁止线程切换,可以保证线程对共享变量的修改是互斥的;

       多核CPU,禁止线程切换,无法保证线程对共享变量的修改是互斥的;

 

合理方案:

       同一时刻只有一个线程执行,称为互斥;如果能保证对共享变量的修改是互斥的,无论是单核CPU,还是多核CPU,

       都能保证原子性;

 

锁模型:

       

 

java中锁技术:synchronzied

      

        1)对应锁模型中加锁的lock() 和解锁的unlock()操作,java编译器会在synchronized修饰的方法或代码块前后自动加上;

        2)  当修饰静态方法时,锁定的是当前类的Class对象;当修饰非静态方法时,锁定的是当前实例对象this;

 

案例分析:

        背景: 

             管程中锁的规则:对一个锁的解锁 Happens-Before后续对这个锁的加锁;

             传递性: A Happens-Before B,B Happens-Before C,则A Happens-Before C;

        分析:

       

         1)对于add()方法,synchronized可以保证其原子性,同一时刻只有一个线程能进入add方法;

         2)可见性问题,根据Happens-Before中管程中锁的规则、传递性原则,可以知道,前一个线程在临界区修改的

               变量对后续进入临界区的线程是可见的;

               因此,如果有100个线程操作add()方法,最终的结果一定是x=100;

         3)线程要进入add() 方法、add()方法,用到的是同一把锁(this锁),符合管程中锁的规则,传递性原则,所以也

              不存在可见性问题;

 

 

 

             

          

          

       

     

 

 

 

 

    

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值