8锁问题
1 标准访问,一个对象,两个同步方法 ,先执行哪个:随机
class Phone{
public synchronized void sendEmail(){
System.out.println("=====Email");
}
public synchronized void sendSMS(){
System.out.println("=====SMS");
}
}
public class Lock8 {
public static void main(String[] args) {
Phone phone = new Phone();
new Thread(()->{
phone.sendEmail();
},"A").start();
new Thread(()->{
phone.sendSMS();
},"B").start();
}
}
情景2:邮件方法暂停4秒,一个对象,两个同步方法 哪个先执行:
答案 : 邮件
解释:被 synchronized 修饰的方式,锁的对象是方法的调用者
所以说这里两个方法调用的对象是同一个,先调用的先执行
package lock8;
import java.util.concurrent.TimeUnit;
class Phone2{
public synchronized void sendEmail() throws Exception{
// Thread.sleep(4000);
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("=====Email");
}
public synchronized void sendSMS() throws Exception{
System.out.println("=====SMS");
}
}
/**
*/
public class Lock8Demo2 {
public static void main(String[] args) throws Exception {
Phone2 phone = new Phone2();
new Thread(()->{
try {
phone.sendEmail();
} catch (Exception e) {
e.printStackTrace();
}
},"A").start();
Thread.sleep(4);
new Thread(()->{
try {
phone.sendSMS();
} catch (Exception e) {
e.printStackTrace();
}
},"B").start();
}
}
情景3 :新增一个普通方法 hello( ),一个对象,哪个方法先执行
答案: hello( )
解释:新增加的这个方法没有 synchronized 修饰,不是同步方法,不受锁的影响!
package lock8;
import java.util.concurrent.TimeUnit;
class Phone3{
public synchronized void sendEmail() throws Exception{
// Thread.sleep(4000);
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("=====Email");
}
public synchronized void sendSMS() throws Exception{
System.out.println("=====SMS");
}
public void hello(){
System.out.println("=====hello");
}
}
/**
* 多线程8锁
* 1 标准访问 一个对象,两个同步方法 哪个先执行:随机
* 2 邮件方法暂停4秒,一个对象,两个同步方法 哪个先执行:,
* 3 新增一个普通方法 hello(),一个对象,哪个方法先执行
*/
public class Lock8Demo3 {
public static void main(String[] args) throws Exception {
Phone3 phone = new Phone3();
new Thread(()->{
try {
phone.sendEmail();
} catch (Exception e) {
e.printStackTrace();
}
},"A").start();
Thread.sleep(4);
new Thread(()->{
try {
phone.hello();
} catch (Exception e) {
e.printStackTrace();
}
},"B").start();
}
}
情景4
两个实例,分别执行 Email (sleep 4 秒) MSM,那个先执行
答案:MSM
这里锁的是两个不同的调用者,所以互不影响
package lock8;
import java.util.concurrent.TimeUnit;
class Phone4{
public synchronized void sendEmail() throws Exception{
// Thread.sleep(4000);
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("=====Email");
}
public synchronized void sendSMS() throws Exception{
System.out.println("=====SMS");
}
}
/**
* 多线程8锁
* 1 标准访问 一个对象,两个同步方法 哪个先执行:随机
* 2 邮件方法暂停4秒,一个对象,两个同步方法 哪个先执行:,
* 3 新增一个普通方法 hello(),一个对象,哪个方法先执行
* 4 两个实例 邮件方法暂停4秒 哪个先执行
*/
public class Lock8Demo4 {
public static void main(String[] args) throws Exception {
Phone4 phone = new Phone4();
Phone4 phone2 = new Phone4();
new Thread(()->{
try {
phone.sendEmail();
} catch (Exception e) {
e.printStackTrace();
}
},"A").start();
Thread.sleep(4);
new Thread(()->{
try {
phone2.sendSMS();
} catch (Exception e) {
e.printStackTrace();
}
},"B").start();
}
}
情景5: 两个静态同步方法 同一个实例
Email先执行
只要方法被 static 修饰,锁的对象就是 Class模板对象,这个则全局唯一!
所以说这里是同一个锁,并不是因为synchronized 这里程序会从上往下依次执行
package lock8;
import java.util.concurrent.TimeUnit;
class Phone5{
public static synchronized void sendEmail() throws Exception{
// Thread.sleep(4000);
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("=====Email");
}
public static synchronized void sendSMS() throws Exception{
System.out.println("=====SMS");
}
}
/**
* 多线程8锁
* 1 标准访问 一个对象,两个同步方法 哪个先执行:随机
* 2 邮件方法暂停4秒,一个对象,两个同步方法 哪个先执行:,
* 3 新增一个普通方法 hello(),一个对象,哪个方法先执行
* 4 两个实例 邮件方法暂停4秒 哪个先执行
* 5 两个静态同步方法 同一个实例
*/
public class Lock8Demo5 {
public static void main(String[] args) throws Exception {
Phone5 phone = new Phone5();
new Thread(()->{
try {
phone.sendEmail();
} catch (Exception e) {
e.printStackTrace();
}
},"A").start();
new Thread(()->{
try {
phone.sendSMS();
} catch (Exception e) {
e.printStackTrace();
}
},"B").start();
}
}
情景6
两个静态同步方法 两个实例
package lock8;
import java.util.concurrent.TimeUnit;
class Phone6{
public static synchronized void sendEmail() throws Exception{
// Thread.sleep(4000);
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("=====Email");
}
public static synchronized void sendSMS() throws Exception{
System.out.println("=====SMS");
}
}
/**
* 多线程8锁
* 1 标准访问 一个对象,两个同步方法 哪个先执行:随机
* 2 邮件方法暂停4秒,一个对象,两个同步方法 哪个先执行:,
* 3 新增一个普通方法 hello(),一个对象,哪个方法先执行
* 4 两个实例 邮件方法暂停4秒 哪个先执行
* 5 两个静态同步方法 同一个实例
* 6 两个静态同步方法 两个实例
*/
public class Lock8Demo6 {
public static void main(String[] args) throws Exception {
Phone6 phone = new Phone6();
Phone6 phone2 = new Phone6();
new Thread(()->{
try {
phone.sendEmail();
} catch (Exception e) {
e.printStackTrace();
}
},"A").start();
new Thread(()->{
try {
phone2.sendSMS();
} catch (Exception e) {
e.printStackTrace();
}
},"B").start();
}
}
情景7
一个静态同步方法 一个普通同步方法 一个实例
SMS先执行
解释:只要被static修饰锁的是class模板, 而synchronized 锁的是调用的对象
- 这里是两个锁互不影响,按时间先后执行
package lock8;
import java.util.concurrent.TimeUnit;
class Phone7{
public static synchronized void sendEmail() throws Exception{
// Thread.sleep(4000);
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("=====Email");
}
public synchronized void sendSMS() throws Exception{
System.out.println("=====SMS");
}
}
/**
* 多线程8锁
* 1 标准访问 一个对象,两个同步方法 哪个先执行:随机
* 2 邮件方法暂停4秒,一个对象,两个同步方法 哪个先执行:,
* 3 新增一个普通方法 hello(),一个对象,哪个方法先执行
* 4 两个实例 邮件方法暂停4秒 哪个先执行
* 5 两个静态同步方法 同一个实例
* 6 两个静态同步方法 两个实例
* 7 一个静态同步方法 一个普通同步方法 一个实例
*/
public class Lock8Demo7 {
public static void main(String[] args) throws Exception {
Phone7 phone = new Phone7();
new Thread(()->{
try {
phone.sendEmail();
} catch (Exception e) {
e.printStackTrace();
}
},"A").start();
Thread.sleep(3);
new Thread(()->{
try {
phone.sendSMS();
} catch (Exception e) {
e.printStackTrace();
}
},"B").start();
}
}
情景8 一个静态同步方法 一个普通同步方法 两个实例
sms先执行
两个锁互不影响
看执行速度 谁先调用谁执行
package lock8;
import java.util.concurrent.TimeUnit;
class Phone8{
public static synchronized void sendEmail() throws Exception{
// Thread.sleep(4000);
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("=====Email");
}
public synchronized void sendSMS() throws Exception{
System.out.println("=====SMS");
}
}
/**
* 多线程8锁
* 1 标准访问 一个对象,两个同步方法 哪个先执行:随机
* 2 邮件方法暂停4秒,一个对象,两个同步方法 哪个先执行:,
* 3 新增一个普通方法 hello(),一个对象,哪个方法先执行
* 4 两个实例 邮件方法暂停4秒 哪个先执行
* 5 两个静态同步方法 同一个实例
* 6 两个静态同步方法 两个实例
* 7 一个静态同步方法 一个普通同步方法 一个实例
* 8 一个静态同步方法 一个普通同步方法 两个实例
*/
public class Lock8Demo8 {
public static void main(String[] args) throws Exception {
Phone8 phone = new Phone8();
Phone8 phone2 = new Phone8();
new Thread(()->{
try {
phone.sendEmail();
} catch (Exception e) {
e.printStackTrace();
}
},"A").start();
Thread.sleep(3);
new Thread(()->{
try {
phone2.sendSMS();
} catch (Exception e) {
e.printStackTrace();
}
},"B").start();
}
}