1. 修饰静态方法中的代码块,两个线程是不同的Demo对象,同一个类锁,线程2无法进入。
把static去掉也一样。
class MyThread1 implements Runnable {
private Demo demo;
public MyThread1(Demo demo) {
this.demo = demo;
}
@Override
public void run() {
demo.demo1();
}
}
class Demo {
public static void demo1() {
synchronized(Demo.class) {
while (true) {
System.out.println(Thread.currentThread());
}
}
}
}
Thread thread1 = new Thread(new MyThread1(new Demo()));
Thread thread2 = new Thread(new MyThread1(new Demo()));
thread1.start();
thread2.start();
2. 修饰静态方法,同上。
3.1 修饰普通成员方法中的代码块,两个线程是不同的Demo对象,不同的对象锁,两个线程都能进入。
class MyThread1 implements Runnable {
private Demo demo;
public MyThread1(Demo demo) {
this.demo = demo;
}
@Override
public void run() {
demo.demo1();
}
}
class Demo {
public void demo1() {
synchronized(this) {
while (true) {
System.out.println(Thread.currentThread());
}
}
}
}
Thread thread1 = new Thread(new MyThread1(new Demo()));
Thread thread2 = new Thread(new MyThread1(new Demo()));
thread1.start();
thread2.start();
3.2 两个线程调用不同方法,thread1调用demo1,thread2调用demo2,都是同一个demo对象且都是o1锁,两个方法只能执行一个。
两个方法逻辑不相干,应该用不同的锁,demo2改为o2
class MyThread1 implements Runnable {
private Demo demo;
public MyThread1(Demo demo) {
this.demo = demo;
}
@Override
public void run() {
demo.demo1();
}
}
class MyThread2 implements Runnable {
private Demo demo;
public MyThread2(Demo demo) {
this.demo = demo;
}
@Override
public void run() {
demo.demo2();
}
}
class Demo {
Object o1 = new Object();
Object o2 = new Object();
public void demo1() {
synchronized(o1) {
while (true) {
System.out.println(Thread.currentThread());
}
}
}
public void demo2() {
synchronized(o1) {
while (true) {
System.out.println(Thread.currentThread());
}
}
}
}
Thread thread1 = new Thread(new MyThread1(d));
Thread thread2 = new Thread(new MyThread2(d));
thread1.start();
thread2.start();
4. 修饰普通成员方法,同3.1。