public synchronized void method() { // todo }
public void run() { synchronized(this) { for (int i = 0; i < 5; i++) { try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } } } }
public synchronized static void method() { // todo }
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中锁一共有四种状态:从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态
偏向锁:
原文:https://www.cnblogs.com/anyanpeng/p/14155875.html