JUC-多线程锁Synchronized锁的八种情况1
1、标准情况下:
package com.nanjing.juc;
class Phone {
public synchronized void sendSMS() throws Exception {
System.out.println(Thread.currentThread().getName()+"---发短信---sendSMS");
}
public synchronized void sendEmail() throws Exception {
System.out.println(Thread.currentThread().getName()+"---发邮件---sendEmail");
}
}
public class ThreadDemo_10 {
public static void main(String[] args) throws Exception {
Phone phone = new Phone();
new Thread(() -> {
try {
phone.sendSMS();
} catch (Exception e) {
e.printStackTrace();
}
}, "AA").start();
Thread.sleep(100);
new Thread(() -> {
try {
phone.sendEmail();
} catch (Exception e) {
e.printStackTrace();
}
}, "BB").start();
}
}
-
synchronized锁的对象是方法的调用者!
-
两个方法用的是同一个锁,谁先拿到谁执行!
2、sendSms方法延迟4秒
因为synchronized锁的对象是方法的调用者!
两个方法用的是同一个锁,谁先拿到谁执行!
AA线程先执行,拿到锁准备执行sendSms方法,
先等4秒,4秒后才开始打印AA---发短信---sendSMS
最后才执行sendEmail方法,打印BB---发邮件---sendEmail
package com.nanjing.juc;
import java.util.concurrent.TimeUnit;
class Phone1 {
public synchronized void sendSMS() throws Exception {
TimeUnit.SECONDS.sleep(4);//或者Thread.sleep(4000);
System.out.println(Thread.currentThread().getName()+"---发短信---sendSMS");
}
public synchronized void sendEmail() throws Exception {
//TimeUnit.SECONDS.sleep(4);//或者Thread.sleep(4000);
System.out.println(Thread.currentThread().getName()+"---发邮件---sendEmail");
}
}
public class ThreadDemo_11 {
public static void main(String[] args) throws Exception {
Phone1 phone1 = new Phone1();
new Thread(() -> {
try {
phone1.sendSMS();
} catch (Exception e) {
e.printStackTrace();
}
}, "AA").start();
Thread.sleep(100);
new Thread(() -> {
try {
phone1.sendEmail();
} catch (Exception e) {
e.printStackTrace();
}
}, "BB").start();
}
}
3、如果sendEmail方法延迟4秒,则结果不同
因为synchronized锁的对象是方法的调用者!
两个方法用的是同一个锁,谁先拿到谁执行!
AA线程先执行,拿到锁准备执行sendSms方法,打印AA---发短信---sendSMS
最后才执行sendEmail方法,先等4秒,4秒后打印BB---发邮件---sendEmail
package com.nanjing.juc;
import java.util.concurrent.TimeUnit;
class Phone1 {
public synchronized void sendSMS() throws Exception {
//TimeUnit.SECONDS.sleep(4);//或者Thread.sleep(4000);
System.out.println(Thread.currentThread().getName()+"---发短信---sendSMS");
}
public synchronized void sendEmail() throws Exception {
TimeUnit.SECONDS.sleep(4);//或者Thread.sleep(4000);
System.out.println(Thread.currentThread().getName()+"---发邮件---sendEmail");
}
}
public class ThreadDemo_11 {
public static void main(String[] args) throws Exception {
Phone1 phone1 = new Phone1();
new Thread(() -> {
try {
phone1.sendSMS();
} catch (Exception e) {
e.printStackTrace();
}
}, "AA").start();
Thread.sleep(100);
new Thread(() -> {
try {
phone1.sendEmail();
} catch (Exception e) {
e.printStackTrace();
}
}, "BB").start();
}
}