zoukankan      html  css  js  c++  java
  • 多线程---再次认识volatile,Synchronize,lock

    在多线程中我们常用的保证共享变量的方法有很多,现在我们介绍其中的一种,volatile,也是效率最高的一种。

       一 、volatile的意义:
                为了确保共享变量能被正确和一致的更新,字段被声明称volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。volatile变量修饰符如果使用恰当的话,它比synchronize的使用和执行成本更低,因此它不会引起线程上下文的切换和调度。
     
       二 、如何保证所有线程看到的这个变量的值是一致的?
     源码中有这样一句, instance = new Singleton();说明这是一个单例,任何线程请求的都是这一个对象。生成汇编代码:

     在汇编代码中会出现 一个lock前缀,有这个前缀会发生两件事:
    1.当前处理器的缓存行的数据都会写回到系统内存。
    2.这个写回内存的操作会引起其他CPU缓存的该内存地址的数据无效。
    为什么好多的都设64个字节,或是hash的一些默认空间设置成16个,原因与处理器结构有关,一般处理器缓存的额告诉缓存行时64个字节宽,换句话说他可以放16个对象,所以追加字节能优化性能。一些我们常见的java集合都是默认的设置空间为16。
      三 、 与Synchronize、lock的区别
           1.synchronize是一种机制,可加在方法上,也可以加载语句块上;lock是一个对象,多线程需要一个ReentrantLock才能实现锁机制。
           2.synchronize是托管给JVM管理的,lock是java代码写的控制锁的实现。
           3.synchronized采用的是悲观锁机制,线程获得的是独占锁,只能依靠阻塞来等待线程释放锁。而且CPU转换线程时上下文切换回引起新城竞争锁,使得效率降低。lock 采用的是乐观锁机制,乐观锁其实就是不加锁,一直去操作,失败就重新操作,直到成功为止,效率高很多。
    4.当竞争不激烈的时候synchronize的性能好一点儿,但是当竞争激烈的时候lock的性能要很多。
       四 、在JVM中锁是如何工作的:
             1.java对象头:hashcode,锁,分代年龄。在运行期间MarkWord 里存储的数据会随着锁标志位的变化而变化,可能变化为下面的数据:
  • 相关阅读:
    前端菜鸡之路——聊天室2.0
    AngularJS入门——hello world!
    前端菜鸡之路——网页上的图标
    可拖动的消息框
    node.js之socket.io模块
    yahoo军规的思考
    如何用jquery实现点击后跳到页面指定位置
    CSS多列布局
    Node.js下Mysql数据库连接
    ABAP 程序报 unicode 错误
  • 原文地址:https://www.cnblogs.com/guweiwei/p/7155701.html
Copyright © 2011-2022 走看看