• 关于Synchornized,Lock,AtomicBoolean和volatile的区别介绍


    1.  volatile 变量可以被看作是一种 “程度较轻的 synchronized”。

    2.  Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。

    同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。在这期的 Java 理论与实践 中,Brian Goetz 将介绍几种正确使用 volatile 变量的模式,并针对其适用性限制提出一些建议。 

        Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。 
    1。http://www.javaeye.com/topic/709435yangyi 《浅谈Java中的同步的方法和原理
    2。http://zhangjunhd.blog.51cto.com/113473/70300 zhangjunhd《Java:使用synchronized和Lock对象获取对象锁》

        Java内存模型中Thread会附有自己的堆栈,寄存器,必要使需要和主存即heap之间同步。可以使用Synchornized关键字和Concurrent包中的Lock保证线程互斥和可见性。

        互斥性体现在类锁或者对象锁上,每个对象自身都包含一个监视器,该监视器是一个每次只能被一个线程获取进入的临界区,可以通过wait和notify来推出的进去临界区。可以看出这是一个生产者—消费者的模型。

    Concurrent包中的Lock为了能够获取更好的性能和更好的扩展性,以及不依赖于关键字的可读代码,自己实现了一个生产消费队列,也就是AbstractQueuedSynchronizer,被称为AQS机制。每个Lock都内置了一个AbstractQueuedSynchronizer。

    需要说明的是AbstractQueuedSynchronizer内部实现采用了CAS机制,通过getState, setState, compareAndSetState访问控制一个32bitint的形式进行互斥。 

    Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的Condition 对象。

     

    1.对象的锁

    所有对象都自动含有单一的锁。

    JVM负责跟踪对象被加锁的次数。如果一个对象被解锁,其计数变为0。在任务(线程)第一次给对象加锁的时候,计数变为1。每当这个相同的任务(线程)在此对象上获得锁时,计数会递增。

    只有首先获得锁的任务(线程)才能继续获取该对象上的多个锁。

    每当任务离开一个synchronized方法,计数递减,当计数为0的时候,锁被完全释放,此时别的任务就可以使用此资源。

    例子:http://zhangjunhd.blog.51cto.com/113473/70300

     

    参考资料:

  • 相关阅读:
    自己写的DBHelper感慨颇深
    23种设计模式:观察者模式,第一次对观察者模式理解的这么通透。
    自己用心写的 存储过程分页 给自己的平台用
    开篇成长的开始[废话一把]
    C# 中i++在ref参数调用下的有趣现象
    点点滴滴的成长[2011111]:理解C#修饰符
    点点滴滴的成长[2011114]:自定义config文件
    扩展方法在Json字符串转化中的应用
    jquery学习二:jquery性能优化
    javascript系列1:函数
  • 原文地址:https://www.cnblogs.com/yangkai-cn/p/4017234.html
Copyright © 2020-2023  润新知