首页 > 其他分享 >关于锁的8个问题

关于锁的8个问题

时间:2022-09-28 11:05:35浏览次数:53  
标签:synchronized void InterruptedException public 问题 关于 new class

问题一:下面代码先执行打电话还是发短信      发短信

public class A {
public static void main(String[] args) throws InterruptedException {
Phone phone = new Phone();

// 锁的存在
new Thread(()->{
try {
phone.sendmsg();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"A").start();
// 休息1s
TimeUnit.SECONDS.sleep(1);

new Thread(()->{ phone.call(); },"B").start();

}
}
@SuppressWarnings("all")
class Phone {

// synchronized锁的对象是方法的调用者
// 两个方法用的是同一个锁,谁先拿到谁执行
public synchronized void sendmsg() throws InterruptedException {
TimeUnit.SECONDS.sleep(4);
System.out.println("发短信");
}
public synchronized void call() {
System.out.println("打电话");
}

}

 

关于锁的8个问题_静态方法

 

 

问题二---如果变为两个对象,下面代码先执行打电话还是发短信?      打电话

public class A {
public static void main(String[] args) throws InterruptedException {
Phone phone1 = new Phone();
Phone phone2 = new Phone();


// 锁的存在
new Thread(()->{
try {
phone1.sendmsg();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"A").start();
// 休息1s
TimeUnit.SECONDS.sleep(1);

new Thread(()->{ phone2.call(); },"B").start();

}
}
@SuppressWarnings("all")
class Phone {

// synchronized锁的对象是方法的调用者
// 两个方法用的是同一个锁,谁先拿到谁执行
public synchronized void sendmsg() throws InterruptedException {
TimeUnit.SECONDS.sleep(4);
System.out.println("发短信");
}
public synchronized void call() {
System.out.println("打电话");
}

}

关于锁的8个问题_发短信_02

 

 

 

问题三---增加普通方法,先打印发短信还是hello?

public class B {
public static void main(String[] args) throws InterruptedException {
Phone2 phone = new Phone2();

new Thread(()->{
try {
phone.sendmsg();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"A").start();
// 休息1s
TimeUnit.SECONDS.sleep(1);

new Thread(()->{ phone.hello(); },"B").start();

}
}
@SuppressWarnings("all")
class Phone2 {

// synchronized锁的对象是方法的调用者
// 两个方法用的是同一个锁,谁先拿到谁执行
public synchronized void sendmsg() throws InterruptedException {

TimeUnit.SECONDS.sleep(4);
System.out.println("发短信");
}
public synchronized void call() {
System.out.println("打电话");
}
// 这里没有锁,不是同步方法,不受锁的影响
public void hello() {
System.out.println("hello");
}

}

关于锁的8个问题_同步方法_03

 

 

 问题四---用不同对象去调用发短信和hello方法,执行结果?

public class B {
public static void main(String[] args) throws InterruptedException {
Phone2 phone1 = new Phone2();
Phone2 phone2 = new Phone2();

new Thread(()->{
try {
phone1.sendmsg();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"A").start();
// 休息1s
TimeUnit.SECONDS.sleep(1);

new Thread(()->{ phone2.hello(); },"B").start();

}
}
@SuppressWarnings("all")
class Phone2 {

public synchronized void sendmsg() throws InterruptedException {

TimeUnit.SECONDS.sleep(4);
System.out.println("发短信");
}
public synchronized void call() {
System.out.println("打电话");
}
// 这里没有锁,不是同步方法,不受锁的影响
public void hello() {
System.out.println("hello");
}

}

关于锁的8个问题_同步方法_04

 

 解释同上

 

问题5---当加了static关键字之后,执行结果是怎样的?

public class C {
public static void main(String[] args) throws InterruptedException {
Phone3 phone = new Phone3();
new Thread(()->{
try {
phone.sendmsg();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"A").start();
// 休息1s
TimeUnit.SECONDS.sleep(1);

new Thread(()->{ phone.call(); },"B").start();

}
}
@SuppressWarnings("all")
// phone3只有唯一的一个class对象 phone3.class(全局唯一)
class Phone3 {

// synchronized锁的对象是方法的调用者
// 两个方法用的是同一个锁,谁先拿到谁执行
// static 静态方法,类一加载就有了,class 模板
// 此时锁的就是class
public static synchronized void sendmsg() throws InterruptedException {

TimeUnit.SECONDS.sleep(4);
System.out.println("发短信");
}
public static synchronized void call() {
System.out.println("打电话");
}
}

关于锁的8个问题_同步方法_05

 

 

 

问题6---当加了static关键字来修饰之后,用两个不同对象来调用,执行结果又是怎样?

public class C {
public static void main(String[] args) throws InterruptedException {
// 两个对象,但此时锁的是class,不关对象事。
// 两个对象的class类模板只有一个
Phone3 phone1 = new Phone3();
Phone3 phone2 = new Phone3();


new Thread(()->{
try {
phone1.sendmsg();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"A").start();
// 休息1s
TimeUnit.SECONDS.sleep(1);

new Thread(()->{ phone2.call(); },"B").start();

}
}
@SuppressWarnings("all")
// phone3只有唯一的一个class对象 phone3.class(全局唯一)
class Phone3 {

// synchronized锁的对象是方法的调用者
// 两个方法用的是同一个锁,谁先拿到谁执行
// static 静态方法,类一加载就有了,class 模板
// 此时锁的就是class
public static synchronized void sendmsg() throws InterruptedException {

TimeUnit.SECONDS.sleep(4);
System.out.println("发短信");
}
public static synchronized void call() {
System.out.println("打电话");
}
}

关于锁的8个问题_同步方法_06

 

 

问题7--普通同步方法和静态同步方法放一起,执行顺序是怎样的?

public class D {
public static void main(String[] args) throws InterruptedException {

Phone4 phone = new Phone4();

new Thread(()->{
try {
phone.sendmsg();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"A").start();
// 休息1s
TimeUnit.SECONDS.sleep(1);

new Thread(()->{ phone.call(); },"B").start();

}
}
@SuppressWarnings("all")
// phone3只有唯一的一个class对象 phone3.class(全局唯一)
class Phone4 {


// 静态同步方法
public static synchronized void sendmsg() throws InterruptedException {

TimeUnit.SECONDS.sleep(4);
System.out.println("发短信");
}
// 普通同步方法
public synchronized void call() {
System.out.println("打电话");
}


}

关于锁的8个问题_静态方法_07

 

 分析:

关于锁的8个问题_静态方法_08

 

 问题8:两个不同对象来调用,结果又是怎样?

public class D {
public static void main(String[] args) throwsphone1 = newphone2 = new Phone4();

new Thread(()->{
try {
phone1.sendmsg();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"A").start();
// 休息1s
TimeUnit.SECONDS.sleep(1);

new Thread(()->{ phone2.call(); },"B").start();

}
}
@SuppressWarnings("all")
// phone3只有唯一的一个class对象 phone3.class(全局唯一)
class Phone4 {


// 静态同步方法
public static synchronized void sendmsg() throws InterruptedException {

TimeUnit.SECONDS.sleep(4);
System.out.println("发短信");
}
// 普通同步方法
public synchronized void call() {
System.out.println("打电话");
}


}

结果:

关于锁的8个问题_静态方法_09

 

标签:synchronized,void,InterruptedException,public,问题,关于,new,class
From: https://blog.51cto.com/u_15810109/5718739

相关文章

  • M1处理器的电脑xcode模拟器编译报错问题详解及解决方案
    在M1芯片的苹果电脑中使用Xcode编译模拟器时,可能会碰到如下报错:   原因是由于M1模拟器架构是arm64架构,而Intel芯片是x86_64的架构,从而导致编译出现了问题。这......
  • 移动端touch拖动事件和click事件冲突问题解决
    通过一个悬浮球交互功能的案例来阐述问题,以及解决办法。实现效果类似微信里的悬浮窗效果,苹果手机的悬浮球功能效果可以点击拖动,然后吸附在窗口边缘点击悬浮球,可......
  • Ubuntu22.04 Windows10安装netifaces失败的问题
    执行命令pipinstall-ihttp://pypi.douban.com/simple/--trusted-host=pypi.douban.com/simplesyfthagrid来安装pysyft和hagrid,但是卡在了netifaces上,重新pipinstall......
  • 24 个关于设备视窗口的 CSS 单位
    过去CSS有4个你必须知道的识别视窗口的单位,并且它们能够很好地处理每个可以想象的用例。然而,随着时间的推移和时代的变化,这4种视口单位现在不足以解决所有用例。于是,CS......
  • nuiapp在APP中的.nvue页面中使用webview展示空白的问题
    之前写的一个uniapp的项目,这段时间又看了一下,在打包的APP中发现webview打开显示空白(以前的时候没问题)一开始以为是链接问题,跨域问题,总之就是各种尝试了因为小程序上没问......
  • 关于鼠标关机还亮的解决方案
    换了个罗技鼠标,已经设置了不良了,然后关机亮了一晚上,半夜还得起床设置一下才能睡,真是亮瞎我的眼了,只要设置一下主机关机的usb供电就好控制面板-电源-勾掉快速启动那个选项......
  • think-queue 问题
    think-queue队列执行的过程中出现'queue:work''redis''--once''--queue=default''--delay=0''--memory=128''--sleep=3''--tries=0'"exceededthetimeoutof60......
  • npm install 安装失败的问题处理
    出错信息解决办法7.0版本npm安装,多会有依赖树错误的问题回退到旧版本npm安装即可D:\code\java\Kuang\vue>npminstall-gnpm@6.14.8......
  • 关于 risrqnis
    这道题里最有用的(RangeInsertSubsetRangeQuery[n?]InSet破案了我那五个点是因为维护不知道有什么用的东西炸了删了就过了题面[JRKSJR4]risrqnis给你......
  • Visual Studio Installer 下载网络连接失败问题的解决办法
    VisualStudioInstaller下载网络连接失败问题的解决办法网络连接失败,出现的问题情况如下图:     进度卡在0然后报网络错误退出。解决办法第一步:查询aka.m......