静态同步方法:静态同步方法的锁是当前类的字节码文件(类名.class);
非静态同步方法:非静态同步方法的锁是this;
同步代码块:同步代码块可以使用自定义的Object对象,也可以使用this或者当前类的字节码文件(类名.class);
- 通过修改下面代码进行验证
public class ClassLock {
public static void main(String[] args) {
ClassLock classLock1 = new ClassLock();
ClassLock classLock2 = new ClassLock();
new Thread(() -> classLock1.lock("第一个线程")).start();
new Thread(() -> classLock2.lock("第二个线程")).start();
}
private void lock(String threadName) {
int i = 0;
do {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(threadName + i);
} while (i++ < 10);
}
}
// 运行结果
第一个线程0
第二个线程0
第二个线程1
第一个线程1
...
第二个线程9
第一个线程9
第一个线程10
第二个线程10
Process finished with exit code 0
- 静态同步方法
public class ClassLock {
public static void main(String[] args) {
ClassLock classLock1 = new ClassLock();
ClassLock classLock2 = new ClassLock();
new Thread(() -> classLock1.lock("第一个线程")).start();
new Thread(() -> classLock2.lock("第二个线程")).start();
}
private synchronized static void lock(String threadName) {
int i = 0;
do {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(threadName + i);
} while (i++ < 10);
}
}
- 非静态同步方法
public class ClassLock {
public static void main(String[] args) {
ClassLock classLock1 = new ClassLock();
ClassLock classLock2 = new ClassLock();
new Thread(() -> classLock1.lock("第一个线程")).start();
new Thread(() -> classLock2.lock("第二个线程")).start();
}
private synchronized void lock(String threadName) {
int i = 0;
do {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(threadName + i);
} while (i++ < 10);
}
}
// 运行结果
第一个线程0
第一个线程1
...
第一个线程9
第一个线程10
第二个线程0
第二个线程1
...
第二个线程9
第二个线程10
- 同步代码块(代码中锁为this.getClass())
public class ClassLock {
public static void main(String[] args) {
ClassLock classLock1 = new ClassLock();
ClassLock classLock2 = new ClassLock();
new Thread(() -> classLock1.lock("第一个线程")).start();
new Thread(() -> classLock2.lock("第二个线程")).start();
}
private void lock(String threadName) {
synchronized (this.getClass()) {
int i = 0;
do {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(threadName + i);
} while (i++ < 10);
}
}
}
// 运行结果
第一个线程0
第一个线程1
...
第一个线程9
第一个线程10
第二个线程0
第二个线程1
...
第二个线程9
第二个线程10