关于锁的8个问题
1、标准状态下先打印发短信还是打电话
发短信
synchronized锁的是方法的调用者,只有1把锁
package com.ShengChanXiaoFei;
import java.util.concurrent.TimeUnit;
public class EightSuo {
public static void main(String[] args) throws InterruptedException {
/*
*
* */
Phone phone1 = new Phone();
// Phone phone2 = new Phone();
new Thread(()->{
phone1.sendSms();
}).start();
//此时两个对象不同 两个调用者 两把锁
TimeUnit.SECONDS.sleep(1);
new Thread(()->{
phone1.call();
}).start();
}
}
class Phone{
// synchronized锁的是方法的调用者
// static 类一加载的时候就有了,锁的是class
// 类的class对象是唯一的
// 静态同步方法
public synchronized void sendSms(){
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("发短信");
}
// 普通同步方法
public synchronized void call(){
System.out.println("打电话");
}
}
2.在发短信时不设置延迟4秒也是和情况1一样的结果
3 增加了一个普通方法后,先执行发短信还是hello
本代码先执行hello
package com.ShengChanXiaoFei;
import java.util.concurrent.TimeUnit;
public class EightSuo {
public static void main(String[] args) throws InterruptedException {
/*
* 3.增加了一个普通方法后,先执行发短信还是hello 因为hello是普通方法
* */
Phone phone = new Phone();
new Thread(()->{
phone.sendSms();
}).start();
TimeUnit.SECONDS.sleep(1);
new Thread(()->{
phone.hello();
}).start();
}
}
class Phone{
// 锁的对象的方法的调用者
public synchronized void sendSms(){
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("发短信");
}
public synchronized void call(){
System.out.println("打电话");
}
public void hello(){
System.out.println("say hello ");
}
}
4.两个对象,两个同步方法 发短信还是打电话先打印
package com.ShengChanXiaoFei;
import java.util.concurrent.TimeUnit;
public class EightSuo {
public static void main(String[] args) throws InterruptedException {
/*
*
* 4.两个对象,两个同步方法 发短信还是打电话先打印
* 打电话先
*
* */
Phone phone1 = new Phone();
Phone phone2 = new Phone();
new Thread(()->{
phone1.sendSms();
}).start();
//此时两个对象不同 两个调用者 两把锁
TimeUnit.SECONDS.sleep(1);
new Thread(()->{
phone2.call();
}).start();
}
}
class Phone{
// 锁的对象的方法的调用者 ---->对象实例
public synchronized void sendSms(){
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("发短信");
}
public synchronized void call(){
System.out.println("打电话");
}
public void hello(){
System.out.println("say hello ");
}
}
5.变为静态同步方法后 发短信还是打电话先打印
package com.ShengChanXiaoFei;
import java.util.concurrent.TimeUnit;
public class EightSuo {
public static void main(String[] args) throws InterruptedException {
/*
*
* 5.变为静态同步方法后 发短信还是打电话先打印
* 发短信先
*
* */
Phone phone = new Phone();
new Thread(()->{
phone.sendSms();
}).start();
//此时两个对象不同 两个调用者 两把锁
TimeUnit.SECONDS.sleep(1);
new Thread(()->{
phone.call();
}).start();
}
}
class Phone{
// synchronized锁的是方法的调用者
// static 类一加载的时候就有了,锁的是class
// 类的class对象是唯一的
public static synchronized void sendSms(){
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("发短信");
}
public static synchronized void call(){
System.out.println("打电话");
}
}
6 变为静态同步方法后,使用两个对象, 发短信还是打电话先打印?
package com.ShengChanXiaoFei;
import java.util.concurrent.TimeUnit;
public class EightSuo {
public static void main(String[] args) throws InterruptedException {
/*
*
* 6.变为静态同步方法后,使用两个对象, 发短信还是打电话先打印?
* 发短信先
*
* */
Phone phone1 = new Phone();
Phone phone2 = new Phone();
new Thread(()->{
phone1.sendSms();
}).start();
//此时两个对象不同 两个调用者 两把锁
TimeUnit.SECONDS.sleep(1);
new Thread(()->{
phone2.call();
}).start();
}
}
class Phone{
// synchronized锁的是方法的调用者
// static 类一加载的时候就有了,锁的是class
// 类的class对象是唯一的
public static synchronized void sendSms(){
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("发短信");
}
public static synchronized void call(){
System.out.println("打电话");
}
}
7、一个对象,普通同步方法和一个静态同步方法? 此时先打印哪个
打电话先打印
for 静态同步方法锁的是类的class对象(唯一) 普通同步方法锁的是类的实例
此时有两把锁
package com.ShengChanXiaoFei;
import java.util.concurrent.TimeUnit;
public class EightSuo {
public static void main(String[] args) throws InterruptedException {
/*
*
* 6.一个对象,普通同步方法和一个静态同步方法? 此时先打印哪个
*打电话先
* */
Phone phone1 = new Phone();
// Phone phone2 = new Phone();
new Thread(()->{
phone1.sendSms();
}).start();
//此时两个对象不同 两个调用者 两把锁
TimeUnit.SECONDS.sleep(1);
new Thread(()->{
phone1.call();
}).start();
}
}
class Phone{
// synchronized锁的是方法的调用者
// static 类一加载的时候就有了,锁的是class
// 类的class对象是唯一的
// 静态同步方法
public static synchronized void sendSms(){
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("发短信");
}
// 普通同步方法
public synchronized void call(){
System.out.println("打电话");
}
}
8 两个对象,普通同步方法和一个静态同步方法? 此时先打印哪个?
打电话先
原理同7
package com.ShengChanXiaoFei;
import java.util.concurrent.TimeUnit;
public class EightSuo {
public static void main(String[] args) throws InterruptedException {
/*
*
* 8.两个对象,普通同步方法和一个静态同步方法? 此时先打印哪个
*打电话先
* 原理同7
* */
Phone phone1 = new Phone();
Phone phone2 = new Phone();
new Thread(()->{
phone1.sendSms();
}).start();
//此时两个对象不同 两个调用者 两把锁
TimeUnit.SECONDS.sleep(1);
new Thread(()->{
phone2.call();
}).start();
}
}
class Phone{
// synchronized锁的是方法的调用者
// static 类一加载的时候就有了,锁的是class
// 类的class对象是唯一的
// 静态同步方法
public static synchronized void sendSms(){
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("发短信");
}
// 普通同步方法
public synchronized void call(){
System.out.println("打电话");
}
}