1.标准访问
class Phone{
public synchronized void sendEmail() throws Exception {
System.out.println("**sendEmail");
}
public synchronized void sendSMS() throws Exception {
System.out.println("**sendSMS");
}
}
public class Lock8Demo {
public static void main(String[] args) throws InterruptedException {
Phone phone=new Phone();
new Thread(()->{
try{
phone.sendEmail();
}catch (Exception e){
e.printStackTrace();
}
},"A").start();
new Thread(()->{
try{
phone.sendSMS();
}catch (Exception e){
e.printStackTrace();
}
},"B").start();
}
}
两个方法均使用synchronized关键字修饰,A、B两线程互斥。线程的执行顺序,是根据cpu的分配情况,而不是根据代码的先后次序,因此打印结果是1,2或者2,1不确定。
2.线程休眠
对sendEmail()方法进行如下修改:
public synchronized void sendEmail() throws Exception {
TimeUnit.SECONDS.sleep(4);
System.out.println("**sendEmail");
}
一个对象只有一把锁,当一个线程获取了该对象的锁之后,其他线程无法获取该对象的锁,所以无法访问该对象的其他synchronized实例方法。(先到先得)
A、B线程执行的先后顺序依然是不确定的,因此打印结果是1,2或者2,1不确定。
3.新增普通方法
在Phone类中新增普通“sayHellow”方法:
public void sayHellow() throws Exception {
System.out.println("**sayHellow");
}
修改线程B中调用的方法
phone.sayHellow();
//phone.sendSMS();