随着JDK8对Synchronized进行了优化,大量使用了Synchronized,下面通过整理的好博文进行总结下。
0、目录
一、介绍
二、原理
三、具体使用
四、总结
一、介绍
二、原理
Synchronized在JVM中实现的原理。每一个对象都有一个监视器锁(monitor),JVM通过进入或退出monitor对象来实现方法同步和代码块同步。monitorenter指令是同步开始的位置,monitorexit是同步结束的位置,两者成对出现。
monitorenter:
线程执行monitorenter指令时,则表示获取monitor对象所有权,当monitor被占用时就处于锁定状态,没有获取monitor时计数为0,进入moniter计数加1,如果线程已经占用monitor,重进入,计数仍然加1.
monitorexit:
执行monitorexit指令,monitor计数减1,如果最后计数为0,则线程退出monitor,不再是这个monitor的持有者,释放锁。被这个monitor阻塞的线程可以尝试获取这个 monitor的所有权。
三、具体使用
//1、对象锁
//形式一:方法锁 锁定的适合当前对象实例
//等价于形式二
class MyClass {
public synchronized void Test() {
System.out.println("start");
try {
Thread.sleep(1000);
} catch (Exception e) {
e.getMessage();
}
System.out.println("end");
}
}
//形式二:同步代码块 锁定的是this,表示当前对象实例
class MyClass {
public void Test() {
synchronized (this) {
System.out.println("start");
try {
Thread.sleep(1000);
} catch (Exception e) {
e.getMessage();
}
System.out.println("end");
}
}
}
//形式三:同步代码块 锁定的是lock,其为自己定义的对象实例
//private byte[] lock = new byte[0];
class MyClass {
public void Test() {
synchronized (lock) {
System.out.println("start");
try {
Thread.sleep(1000);
} catch (Exception e) {
e.getMessage();
}
System.out.println("end");
}
}
}
//2、类锁
//形式一:静态方法 锁定的是当前类
//等价于形式二
class MyClass {
public static synchronized void Test() {
System.out.println("start");
try {
Thread.sleep(1000);
} catch (Exception e) {
e.getMessage();
}
System.out.println("end");
}
}
//形式二:代码块 锁定的是类
class MyClass {
public void Test() {
synchronized (MyClass.class) {
System.out.println("start");
try {
Thread.sleep(1000);
} catch (Exception e) {
e.getMessage();
}
System.out.println("end");
}
}
}
四、总结
原文:https://blog.youkuaiyun.com/haovin/article/details/90763698