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

参考资料:

转载于:https://www.cnblogs.com/yangkai-cn/p/4017234.html

关于Synchornized,Lock,AtomicBoolean和volatile的区别介绍相关推荐

  1. synchronize和lock的区别 synchionzie与volatile的区别

    synchronized与Lock的区别 https://www.cnblogs.com/iyyy/p/7993788.html Lock和synchronized和volatile的区别和使用 ht ...

  2. day 23-24 面试题:synchronized和volatile的区别;final,finally,finalize区别

    面试题: 1. synchronized和volatile的区别 2. final,finally,finalize区别 1. synchronized和volatile的区别 1.1 JVM内存模型 ...

  3. 既生synchronized,何生volatile (synchronized与volatile的区别)

    既生synchronized,何生volatile (synchronized与volatile的区别) 我们知道,synchronized和volatile两个关键字是Java并发编程中经常用到的两 ...

  4. PHP中file_exists与is_file,is_dir的区别介绍

    PHP中file_exists与is_file,is_dir的区别介绍 作者: 字体:[增加 减小] 类型:转载 时间:2012-09-12 我要评论 很显然file_exists是受了asp的影响, ...

  5. guid linux 识别的分区表_Linux系统MBR和GPT分区的区别介绍

    主引导记录(Master Boot Record , MBR)是指一个存储设备的开头 512 字节.它包含操作系统的引导器和存储设备的分区表. 全局唯一标识分区表(GUID Partition Tab ...

  6. slc、mlc、tlc闪存芯片颗粒区别介绍

    2019独角兽企业重金招聘Python工程师标准>>> slc.mlc.tlc闪存芯片颗粒区别介绍   SLC = Single-Level Cell ,即1bit/cell,速度快 ...

  7. 服务器硬盘SAS与SATA区别介绍

    服务器硬盘SAS与SATA区别介绍SAS硬盘与SATA硬盘: 串行技术 - 包括SAS硬盘(串行连接SCSI)和SATA硬盘(串行ATA)- 比旧款的Intel Xeon服务器有了更好的RAS性能.当 ...

  8. python输入和输出的区别_python2和python3的输入和输出区别介绍

    Python3 输入和输出 输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数. 第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdou ...

  9. 网络:WiFi6和WiFi5的区别介绍

    随着WiFi6时代的到来,那么就代表WiFi5时代的落幕,目前不少手机厂商或者电脑无线网卡厂商都将为自家设备添加支持WiFi6.那么大家是否了解对"WiFi6"有所了解呢?WiFi ...

最新文章

  1. 徒劳的对抗——如何做好极客的老婆(灵感来源于《你就是极客》)
  2. 节能电磁无线电导航信号放大电路 150kHz制版
  3. mysql猎豹_猎豹网校MySQL数据库
  4. ADO.NET开发总结(学习笔记)
  5. 03_03 bash特性详解(下)
  6. BZOJ2459 : [BeiJing2011]神秘好人
  7. C语言中printf输出特殊字符(“%d“或者“\n“)
  8. 测试工程方法:判定表驱动法
  9. POJ 2828 Buy Tickets(单点更新) 详细题解和思路
  10. 浅谈c#变量的命名规则
  11. windows10防Linux,用户禁用Defender提升Win10 Linux子系统性能
  12. 通过python获取浏览器cookie
  13. 搜索时输入关键词进行匹配
  14. 教资科目二重点简答题总结
  15. python编程方块_趣味Python编程之经典俄罗斯方块
  16. springboot中使用kafka
  17. Java之BlockingQueue
  18. python等于号前后一定要加空格吗_英语标点前后要加空格吗?
  19. python 查看处理器架构
  20. 传感网应用开发(环境部署)

热门文章

  1. 用计算机来弹一首少年,辽宁省锦州市2018年中考语文试卷(word版,含答案)
  2. python gil锁_python--GIL锁
  3. linux中网卡的流量怎么通过c语言获取_用Python获取计算机网卡信息
  4. php 给富文本里的图片增加ALT、TITLE属性
  5. uni-app条件编译:#ifdef #ifndef #endif
  6. mysql显示错误代码1067_每日一记--Mysql错误代码1067
  7. for i in range什么意思_python迭代和解析——range、map函数
  8. 零窗口探测怎么抓包_天问·探路火星|五大亮点!最快“胖五”把探测器送入苍穹...
  9. Linux删除安卓温控,RK平台关闭温度控制降频功能
  10. linux下比较文件并输出,Linux使用diff命令比较文件的方法