静态同步synchronized方法与非静态同步synchronized方法的锁
1、静态同步synchronized方法锁是本类的字节码文件锁
2、非静态同步synchronized方法的锁是this锁
syA、syB、syC、syD、syE五个方法
package com.example.demo.my_synchronized;
/**
* @ Author :lzy
* @ Date :Created in 2019/8/5 15:00
* @ Description:
*/
public class Synchronized {
public synchronized void syA(){
System.out.println("this is syA");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void syB(){
synchronized (this){
System.out.println("this is syB");
}
}
public void syC(){
String s="1";
synchronized (s){
System.out.println("this is syC");
}
}
public void syD(){
synchronized (Synchronized.class){
System.out.println("this is syD");
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized static void syE(){
System.out.println("this is syE");
}
}
定义
package com.example.demo.my_synchronized;
/**
* @ Author :lzy
* @ Date :Created in 2019/8/5 15:07
* @ Description:
*/
public class SynchronizedMain {
public static void main(String[] args) {
Synchronized aSynchronized = new Synchronized();
new Thread(new Runnable() {
@Override
public void run() {
aSynchronized.syA();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
aSynchronized.syB();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
aSynchronized.syC();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
aSynchronized.syD();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
aSynchronized.syE();
}
}).start();
}
}
运行结果
运行结果–比较syA、syB、syC运行时间,syA与syC快速出现,而syB是三秒之后出现,证明执行syA时睡眠三秒是,syB等待,等syA释放锁之后syB执行,所以非静态同步方法锁就是this锁。
运行结果–比较syD、syE,当syD释放锁之后syE执行,所以静态同步方法是类字节码锁