JAVA中synchronized锁的总结
前提:phone类中有两个synchronized修饰的同步方法,让两个线程分别去执行这两个方法,判断谁先输出。
//基础代码,线程A\B分别执行send()和call()
public class LockDemo {
public static void main(String[] args) {
Phone phone = new Phone();
new Thread(() -> {
phone.send();}, "A").start();
new Thread(() -> {
phone.call();}, "B").start();
}
}
class Phone{
//synchronized锁的对象是方法的调用者
//两个方法使用的是同一个锁,谁先拿到谁先执行
public synchronized static void send(){
System.out.println("发短信");
}
public synchronized void call(){
System.out.println("打电话");
}
}
在main线程中添加sleep。
判断1:标准情况下,两个线程先执行发短信还是打电话?
public class LockDemo {
public static void main(String[] args) {
Phone phone = new Phone();
new Thread(() -> {
phone.send();}, "A").start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(() -> {
phone.call();}, "B").start();
}
}
class Phone{
//synchronized锁的对象是方法的调用者
//两个方法使用的是同一个锁,谁先拿到谁先执行
public synchronized static void send(){
System.out.println(Thread.currentThread().getName()+"发短信");
}
public synchronized void call(){
System.out.println(Thread.currentThread().getName()+"打电话");
}
答案:先发短信,此时是因为在主线程中添加了sleep方法,先对线程A进行了start,在sleep之后才对线程B进行了启动??
判断2:令send方法延迟4s,两个线程先输出发短信还是打电话?
public class LockDemo {
public static void main(String[] args) {
Phone phone = new Phone();
new Thread(() -> {
phone.send();}, "A").start(