zoukankan      html  css  js  c++  java
  • Java并发机制深究1-synchronized和volatile

     在多线程并发编程中,synchronized和volatile都是很重要的,volatile是轻量级的synchronized。在多处理器编程中保证共享变量的统一性。

    1.volatile的使用和原理

    如果一个变量被声明为volatile,java线程内存模型确保所有线程中得到变量的值是一致的。

    在对volatile修饰的变量进行赋值操作时会引发两个操作:

    <1> 把当前处理器缓冲行中的数据写入内存;

    <2> 写回内存的操作会使其他cpu中缓存的数据无效。

    2.synchronized的原理

    Java中的每一个对象都可以作为锁,具体表现为:

    <1> 对于普通同步方法,锁是当前实例对象;

    <2> 对于静态同步方法,锁是当前class对象;

    <3> 对于同步代码块,锁是synchronized括号里配置的对象;

    从jvm规范中可以看出synchronized的实现原理,jvm是根据monitor对象来实现的。代码块同步是根据monitorenter和monitorexit指令实现的。

    monitorenter指令在编译后插入到同步代码块的开始位置,而monitorexit是插入到代码块的结束和异常处,jvm要保证monitorenter和monitorexit进行配对。当线程执行到monitorenter指令时,获取对象所对应的monitor的所有权,获得对象的锁,此时其他线程访问此对象就处于阻塞状态。当执行到monitorexit时,线程会释放掉锁。

  • 相关阅读:
    基于DPDK的高效包处理系统
    Docker在centos系统上的安装
    TCP三次握手
    service与kube-proxy
    路由策略和策略路由
    golang context 超时自动取消方法
    用Dockerfile构建镜像
    kubemark模拟k8s计算节点,测试k8s组件性能
    golang动画等待计算菲波那契结果
    golang实现的倒计时计数器
  • 原文地址:https://www.cnblogs.com/wuyuetian/p/5498937.html
Copyright © 2011-2022 走看看