synchronized实现同步的基础:Java中的每一个对象都可以作为锁。
具体表现为以下3种形式。
对于普通同步方法,锁是当前实例对象。
对于静态同步方法,锁是当前类的Class对象。
对于同步方法块,锁是Synchronized括号里配置的对象
package juc;
import java.util.concurrent.TimeUnit;
class Phone {
public synchronized void sendSMS() throws Exception {
//停留4秒
//TimeUnit.SECONDS.sleep(4);
System.out.println("------sendSMS");
}
public synchronized void sendEmail() throws Exception {
System.out.println("------sendEmail");
}
public void getHello() throws Exception {
System.out.println("------getHello");
}
}
/**
* @Description: 8锁
* 1 标准访问,先打印短信还是邮件
* ------sendSMS
* ------sendEmail
*
* 2 停4秒在短信方法内,先打印短信还是邮件
* ------sendSMS
* ------sendEmail
*
* 3 新增普通的hello方法,是先打短信还是hello
* ------sendHello
* ------sendSMS
*
* 4 现在有两部手机,先打印短信还是邮件
* ------sendEmail
* ------sendSMS
*
* 5 两个静态同步方法,1部手机,先打印短信还是邮件
* ------sendSMS
* ------sendEmail
*
* 6 两个静态同步方法,2部手机,先打印短信还是邮件
* ------sendSMS
* ------sendEmail
*
* 7 1个静态同步方法,1个普通同步方法,1部手机,先打印短信还是邮件
* ------sendEmail
* ------sendSMS
*
* 8 1个静态同步方法,1个普通同步方法,2部手机,先打印短信还是邮件
* ------sendEmail
* ------sendSMS
*/
public class Lock_8 {
public static void main(String[] args) throws InterruptedException {
Phone phone = new Phone();
Phone phone2 = new Phone();
new Thread(()->{
try {
phone.sendSMS();
} catch (Exception e) {
e.printStackTrace();
}
},"AA").start();
Thread.sleep(100);
new Thread(()->{
try {
phone.sendEmail();
//phone.getHello();
//phone2.sendEmail();
} catch (Exception e) {
e.printStackTrace();
}
},"BB").start();
}
}