sychronized的实现原理和应用
一、synchronized的使用
1.1修饰方法
public synchronized void method()
{
// todo
}
1.2修饰代码块
public void run() {
synchronized(this) {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
1.3修饰静态方法
public synchronized static void method() {
// todo
}
1.4修饰一个类
class ClassName {
public void method() {
synchronized(ClassName.class) {
// todo
}
}
}
对于普通方法,锁是当前实例对象
对于静态同步方法,锁是当前类的Class对象
对于同步方法快,锁是Synchonized括号里配置的对象
二、对象锁的分析
当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常是必须释放锁
锁是怎么实现代码同步的:
这里有个minitor对象,其特点是:在同一时间,只有一个线程/进程能进入monitor所定义的临界区,这使得monitor可以实现互斥的效果,无法进入monitor临界区的进程/线程被阻塞,在适当的时候被唤醒
java对象存储在内存中分为三部分:对象头、实例数据和对齐填充,对象头中存储了锁标识
java对象头分析:
Java对象头里的Mark Word里默认存储对象的HashCode、分代年龄和锁标记位
运行期间,Mark Word里存储的数据会随着锁标志位的变化而变化。Mark Word可能变化为存储一下4种数据
锁对象基本原理:
当一个线程需要获取Object的锁时,会被放入EntrySet中进行等待,已经获取到锁的线程在缺少谋些外界条件的情况下,可能无法继续进行,那么线程就通过wait()方法将锁释放
进入wait Set区进行等待,当外部条件满足时,先被阻塞的线程就先进去EnterySet区去竞争锁,这个外界条件在monitor机制中被称为条件变量
三、锁的升级
JavaSE1.6中锁一共有四种状态:从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态
偏向锁:
sychronized的实现原理和应用的更多相关文章
- 【Java】【JVM】Sychronized底层加锁原理详解
我们首先先看看JMM模型,话不多说,上图: JMM对应的8大原子操作: read(读取):从主内存读取数据 load(载入):将主内存读取到的数据写入工作内存 use(使用):从工作内存读取数据来计算 ...
- Java多线程-基础知识
一. 进程是执行中的程序,程序是静态的(我们写完以后不运行就一直放在那里),进程是执行中的程序,是动态概念的.一个进程可以有多个线程. 二. 多线程包含两个或两个以上并发运行的部分,把程序中每个这样并 ...
- HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...
- Atitit.软件与编程语言中的锁机制原理attilax总结
Atitit.软件与编程语言中的锁机制原理attilax总结 1. 用途 (Db,业务数据加锁,并发操作加锁.1 2. 锁得类型 排它锁 "互斥锁 共享锁 乐观锁与悲观锁1 2.1. 自旋锁 ...
- ArrayList/Vector的原理、线程安全和迭代Fail-Fast
疑问 * ArrayList是非线程非安全的,具体是指什么?具体会产生什么问题?* ArrayList的内部原理是什么?为什么可以动态扩容?* Vector是线程安全的,具体是如何实现的?为什么不再推 ...
- 解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度-美团)
还有其他的锁,如果想要了解,参考:JAVA锁机制-可重入锁,可中断锁,公平锁,读写锁,自旋锁, 用synchronized实现ReentrantLock 美团面试题参考:使用synchronized ...
- (转)HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...
- Dubbo学习笔记6:Dubbo增强SPI与SPI中扩展点自动包装的实现原理
在Dubbo整体架构分析中介绍了Dubbo中除了Service和Config层为API外,其他各层均为SPI,为SPI意味着下面各层都是组件化可以被替换的,也就是扩展性比较强,这也是Dubbo比较好的 ...
- 深入理解多线程(四)—— Moniter的实现原理
在深入理解多线程(一)——Synchronized的实现原理中介绍过关于Synchronize的实现原理,无论是同步方法还是同步代码块,无论是ACC_SYNCHRONIZED还是monitorente ...
随机推荐
- [转载]Redis 持久化之RDB和AOF
原文链接:https://www.cnblogs.com/itdragon/p/7906481.html 温馨提示 在正式数据(当然是非生产环境啦)练习以下操作时,一定一定一定记得备份dump.rdb ...
- 三大Mac清理工具实用性测评,哪款好用?
相信大多数MAC用户都较为了解,Mac虽然有着许多亮点的性能,但是让用户叫苦不迭的还其硬盘空间小的特色,至于很多人因为文件堆积以及软件缓存等,造成系统空间内存不够使用的情况.于是清理工具就成为了大多数 ...
- python中操作excel数据
python操作excel,python有提供库 本文介绍openpyxl,他只支持新型的excell( xlsx)格式,读取速度还可以 1.安装 pip install openpyxl 2.使用 ...
- 对于AQS的理解
1.JUC包中的 CountDownLatch.CyclicBarrier.ReentrantLock和Semaphore都是基于AQS(AbstractQuenedSynchronizer)实现的 ...
- python 如何跳过异常继续执行
使用try...except...语句,类似于if...else...,可以跳过异常继续执行程序,这是Python的优势 用法如下: 1 2 3 4 5 6 try: # 可能会 ...
- 适合 Java 新手的开源项目集合——在 GitHub 学编程
作者:HelloGitHub--老荀 当今互联网份额最大的编程语言是哪一个?是 Java!这两年一直有听说 Java 要不行了.在走下坡路了.没错,Java 的确在走下坡路,未来的事情的确不好说,但是 ...
- QQ账号测试用例
- Java集合【2】--iterator接口详解
目录 一.iterator接口介绍 二.为什么需要iterator接口 三.iterator接口相关接口 3.1 ListIterator 3.2 SpitIterator 3.2.1 SpitIte ...
- 【mq读书笔记】Index索引文件
1.IndexHeader头部,40字节,记录IndexFile的统计信息: begainTimestamp:该索引文件中包含消息的最小存储时间 endTimestamp:该索引文件中包含消息的最大存 ...
- Docker容器版Jumpserver堡垒机搭建部署方法附Redis
1.简介 Jumpserver是全球首款完全开源的堡垒机,多云环境下更好用的堡垒机,使用GNU GPL v2.0开源协议,是符合 4A 的专业运维安全审计系统,使用Python / Django 进行 ...