Synchronized的两种方式
- 1)对象锁
包含方法锁(默认锁对象为this当前实例对象) 和 同步代码块锁(自己制定锁对象)
synchronized(this) synchronized(new Object()) - 2)类锁
锁为Class对象(字节码对象)
synchronized可以用来修饰代码块和方法。
synchronized修饰普通方法时,锁对象是this对象。修饰静态方法时,锁对象是字节码文件对象。
1、同步方法
synchronized修饰普通方法
public synchronized void run() {
System.out.println(1);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(2);
}
使用同一对象访问
Demo demo = new Demo();
new Thread(() -> demo.run()).start();
new Thread(() -> demo.run()).start();
如果使用不同的对象访问
Demo demo = new Demo();
new Thread(() -> demo.run()).start();
Demo demo2 = new Demo();
new Thread(() -> demo2.run()).start();
synchronized修饰静态方法
public static synchronized void run() {
System.out.println(1);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(2);
}
使用不同的对象访问
Demo demo = new Demo();
new Thread(() -> demo.run()).start();
Demo demo2 = new Demo();
new Thread(() -> demo2.run()).start();