8锁问题

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();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值