首页 > 技术文章 > 八锁(锁的八个问题)

jzspace 2020-05-24 11:21 原文

public class Lock8 {
public static void main(String[] args) {
Phone p = new Phone();
new Thread(()->{ p.sendMsg();},"a").start();
TimeUnit.SECONDS.sleep(1);
new Thread(()->{ p.call(); },"b").start();
}
}
class Phone{
public synchronized void sendMsg(){
TimeUnit.SECONDS.sleep(4);
System.out.println("发短信");
}
public synchronized void call(){
System.out.println("打电话");
}
}

---大概的代码块,执行发短信方法前要先睡了4秒,执行第二个线程前先睡了1秒。---
---以下笔记都是在上面有延迟的情况下执行---

1、Synchronized方法 锁的是对象,谁调用这个方法,它锁的就是谁。锁的是方法的调用者。两个方法用的同一个锁,谁先拿到谁执行。

2、有锁和无锁同时执行时,无锁先执行。因为它没有锁,不是同步方法,不受锁的影响。

3、静态的同步方法锁的是Class类模板。

4、锁的不是同一个,那么后面的线程不需要等待前面线程执行完。

5、对象调用这个有锁的方法,那么锁的就是对象 就是this。对象调用static锁的方法,那么锁的就是Class类模板。

推荐阅读