我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《线程八锁》, 一起来围观吧 https://blog.csdn.net/qq_31807385/article/details/83048919
判断打印的 “one” or “two” ?
- 两个普通同步方法,两个线程,标准打印, 打印结果?
- 新增 Thread.sleep() 给 getOne(),打印结果?
- 新增普通方法 getThree() , 打印结果?
- 两个普通同步方法,两个 Number 对象,打印结果?
- 修改 getOne() 为静态同步方法,打印结果?
- 修改两个方法均为静态同步方法,一个 Number 对象,打印结果?
- 一个静态同步方法,一个非静态同步方法,两个 Number 对象,打印结果?
- 两个静态同步方法,两个 Number 对象,打印结果?
要想知道上面线程8锁的答案,需要知晓关键所在:
① 非静态方法的锁默认为 this(实例对象), 静态方法的锁为对应的 Class 对象(类对象)。
② 某一个时刻,同一个对象,只能有一个线程持有锁,无论几个方法。
③ 锁静态方法,某一个时刻,不同实例对象也只能有一个对象持有锁。
public class TestThread8Monitor {
public static void main(String[] args) {
Number number = new Number();
Number number2 = new Number();
new Thread(new Runnable() {
@Override
public void run() {
number.getOne();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// number.getTwo();
number2.getTwo();
}
}).start();
// new Thread(new Runnable() {
// @Override
// public void run() {
// number.getThree();
// }
// }).start();
}
}
class Number{
public static synchronized void getOne(){
try {
Thread.sleep(3000);
System.out.println("--过了3秒--");
} catch (InterruptedException e) {
}
System.out.println("one");
}
public static synchronized void getTwo(){
System.out.println("two");
}
public void getThree(){
System.out.println("three");
}
}
1、两个普通同步方法,两个线程,一个 Number 对象,标准打印, 打印结果? //one two
2、新增 Thread.sleep() 给 getOne() ,打印结果? // --过了3秒-- one two
3、新增普通方法 getThree() , 打印结果? //three --过了3秒-- one two
4、两个普通同步方法,两个 Number 对象,打印结果? //two --过了3秒-- one
5、修改 getOne() 为静态同步方法,打印结果? //two --过了3秒-- one
6、修改两个方法均为静态同步方法,一个 Number 对象,打印结果? //–过了3秒-- one two
7、一个静态同步方法,一个非静态同步方法,两个 Number 对象,打印结果? //two --过了3秒-- one
8、两个静态同步方法,两个 Number 对象,打印结果? //–过了3秒-- one two