八锁案例
个人感觉需要判断是否加锁,加的是否为同一把锁,同一把锁需要等待,不同的锁不用等待。
package com.magic.juc0117;
import java.util.concurrent.TimeUnit;
/**
* 1.标准访问,先打印邮件还是短信?
* 绝不会同时进去,只要在一个资源类里面,不管他有多少同步方法,只要一个线程先访问了资源类里
* 的任何一个同步方法,锁的是该方法所在的资源类,即锁的是这个对象。
* 2.暂停4秒邮件方法,先打印邮件还是短信?
* 邮件 同一把锁,要等待
* 3.新增普通sayHello方法,请问先打印邮件还是短信? hello,没加锁
* 不是同步方法,不受锁的影响,所以不需要等待。其他线程共用了一把锁,所以还需要等待。
* 4.两部手机,请问先打印邮件还是短信?
* 短信,两把不同锁,不用等待
* 5.两个静态同步方法,同一部手机,请问先打印邮件还是短信? 等待1秒 邮件 短信
* 被synchronized和static修饰的方法,锁的对象是类的class对象。因为两个同步方法都被static修饰了,
* 所以两个方法用的是同一个锁,后调用的方法需要等待先调用的方法。
* 6.两个静态同步方法,两部手机,请问先打印邮件还是短信? 邮件
* 锁的都是类的Class对象,其实还是同一把锁,需要等待。
* 7.一个静态同步方法,一个普通同步方法,同一部手机,请问先打印邮件还是短信? 短信
* 被synchronized和static修饰的方法,锁的对象是类的class对象。仅仅被synchronized修饰的方法,锁的对象是方法的调用者。
* 因为两个方法锁的对象不是同一个,所以两个方法用的不是同一个锁,后调用的方法不需要等待先调用的方法。
* 8.一个静态同步方法,一个普通同步方法,两部手机,请问先打印邮件还是短信? 短信
* 不是同一把锁,不用等待
*/
class Phone{
public static synchronized void sendEmail() throws Exception {
TimeUnit.SECONDS.sleep(4);//暂停4秒 后面也一直在
System.out.println("sendEmail----------");
}
public synchronized void sendSMS() throws Exception{
System.out.println("sendSMS-------------");
}
public void sayHello() throws Exception{
System.out.println("hello");
}
}
public class Lock8Demo05 {
public static void main(String[] args) throws Exception {
Phone phone = new Phone();
Phone phone2 = new Phone();
new Thread(() -> {
try {
System.out.println("s1");
phone.sendEmail();
} catch (Exception e) {
e.printStackTrace();
}
},"A").start();
Thread.sleep(1000);
new Thread(() -> {
try {
System.out.println("s2");
phone2.sendSMS();
} catch (Exception e) {
e.printStackTrace();
}
},"B").start();
new Thread(() -> {
try {
phone.sayHello();
} catch (Exception e) {
e.printStackTrace();
}
},"C").start();
}
}
学习整理于JUC.