【搞定Java并发编程】第10篇:锁的内存语义

上一篇:CAS详解:https://blog.csdn.net/pcwl1206/article/details/84892287

目  录

1、锁的释放-获取建立的happens-before关系

2、释放锁和获取锁的内存语义

3、锁内存语义的实现

4、concurrent包的实现


众所周知,锁可以让临界区互斥执行。这里将介绍锁的另一个同样重要,但是经常被忽视的功能:“锁的内存语义”。

1、锁的释放-获取建立的happens-before关系

锁是Java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息

下面是锁释放-获取的示例代码:

class MonitorExample {
    int a = 0;
 
    public synchronized void writer() {  //1
        a++;                             //2
    }                                    //3
 
    public synchronized void reader() {  //4
        int i = a;                       //5
        ……
    }                                    //6
}

假设线程A执行writer()方法,随后线程B执行reader()方法。根据happens规则(happens-before原则可查看:Java内存模型详解),这个过程包含的happens-before关系可以分为3类:

1、根据程序次序规则,1 happens before 2, 2 happens before 3; 4 happens before 5, 5 happens before 6;

2、根据监视器锁规则,3 happens before 4;

3、根据happens before 的传递性,2 happens before 5。

上述happens before 关系的图形化表现形式如下:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值