今天看到看到一个有意识的问题。记录一下

public class Test {synchronized void SayHello1() {}
}

问synchronized修饰的方法代码块会同步么?

感觉有坑,抓紧时间测试一次。填充下方法

public class Test {synchronized void SayHello1() {System.out.println("SayHello1 enter");try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("SayHello1 out");}public static void main(String[] args) {new Thread(() -> new Test().SayHello1()).start();new Thread(() -> new Test().SayHello1()).start();}}

运行之后发现有意识了

SayHello1 enter
SayHello1 enter
SayHello1 out
SayHello1 out

发现并没有像我想的那样是同步的运行。

思考:synchronized 修饰的方法没有进行同步,只能说明synchronized 的加锁对象不是同一个,应该是启用线程时new Test() 的问题。

改进:

 public static void main(String[] args) {Test test = new Test();new Thread(() -> test.SayHello1()).start();new Thread(() -> test.SayHello1()).start();}

这回我创建一个对象,然后线程去调用方法测试。

SayHello1 enter
SayHello1 out
SayHello1 enter
SayHello1 out

结果正确,那就说明上面线程中 synchronized 修饰的对象不是一个对象的验证。

那么问题来了,在实际的开发过程中很少有像下面那种先创建对象再去调用的方式,那么还有别的方式么?

思考:既然第一种情况每次都创建对象去调用,synchronized的加锁对象不是一个,那能不能让synchronized 的加锁对象是同步一个对象呢?

方案:

在方法中增加指定的加锁对象。

void SayHello1() {synchronized (Test.class) {System.out.println("SayHello1 enter");try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("SayHello1 out");}
}

那还有别的方式么??

我想到了一个关键字  static ,static 修饰的方法在初始化的时候就被加载,所以对象也是同一个。

synchronized static void SayHello1() {System.out.println("SayHello1 enter");try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("SayHello1 out");
}
public static void main(String[] args) {new Thread(() -> Test.SayHello1()).start();new Thread(() -> Test.SayHello1()).start();
}

结果显示正常

留个思考:

public static void main(String[] args) {new Thread(() -> new Test().SayHello1()).start();new Thread(() -> new Test().SayHello1()).start();
}

这里我不直接使用Test对象,我通过new Test()  也是可以实现的,为什么呢?

参考下:Java static修饰方法_风中的劲草-CSDN博客_static修饰的方法一、static 修饰方法 1、与静态变量一样,我们也可以使用 static 修饰方法,称为静态方法或类方法。其实之前我们一直写的 main 方法就是静态方法。调用静态方法可通过类名访问或者对象方法。 例如:public class StaticMethod {//使用static关键字修饰静态方法public static void print(){System.out.println(https://blog.csdn.net/qq_18505715/article/details/70666947

synchronized 修饰方法相关推荐

  1. synchronized修饰方法

    文章目录 前言 一.Synchronized修饰非静态方法 二.Synchronized修饰静态方法 三.类锁和对象锁的访问是不冲突的 四.总结 前言 直接说结论: 1.Synchronized修饰非 ...

  2. date对象加十分钟_一张图讲解对象锁和关键字synchronized修饰方法(代码块)

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 每个对象在出生的时候就有一把钥匙(监视器Monitor),那么被synchronized 修饰的方法相当于给方法加了一个锁 ...

  3. synchronized修饰方法和代码块的区别

    先看一段代码 Class A {public synchronized methodA() {//对当前对象加锁 }public methodB() {synchronized(this){}//对当 ...

  4. Java多线程--synchronized修饰普通方法和修饰静态方法的区别

    初始化一个对象时,会自动生成一个与该对象对应的对象锁,被synchronized 修饰的方法就得依靠对象锁工作.当多线程同时访问某个被synchronized修饰的方法时,一旦某个进程抢得对象锁之后, ...

  5. synchronized 修饰static方法

    •1.依靠对象锁锁定 初始化一个对象时,自动有一个 对象锁. synchronized {普通方法}依靠对象锁工作,多线程访问synchronized方法,一旦某个进程抢得锁之后,其他的进程只有排队对 ...

  6. java中synchronized修饰静态方法和非静态方法有什么区别?

    Synchronized修饰非静态方法 Synchronized修饰非静态方法,实际上是对调用该方法的对象加锁,俗称"对象锁". Java中每个对象都有一个锁,并且是唯一的.假设分 ...

  7. 使用synchronized修饰静态方法和非静态方法有什么区别

    前言 最近被问到了这个问题,第一次回答的也是很不好,在此参考网上答案进行整理记录.供大家学习参考. Synchronized修饰非静态方法 Synchronized修饰非静态方法,实际上是对调用该方法 ...

  8. synchronized修饰静态方法与实例方法

    一.synchronized修饰实例方法: synchronized修饰实例方法,实际上是对调用该方法的对象加锁. 场景1:同一实例对象在两个线程中分别调用该对象的两个同步实例方法 public cl ...

  9. java synchronized 静态_Java之Synchronized修饰实例方法和静态方法

    一.Synchronized修饰实例方法,实际上是对调用该方法的对象加锁,俗称"对象锁" 情况一:​同一个对象在两个线程中分别访问该对象的两个同步实例方法 结果:会产生互斥​ 原因 ...

最新文章

  1. Java学习总结:39(反射机制)
  2. 计算机四级操作系统原理知识汇总,2015年全国计算机四级《操作系统原理》考试内容...
  3. intellij 快捷键
  4. linux移植会话层层协议,Linux内核移植-南京林业大学毕业设计.DOC
  5. Vue实现仿音乐播放器4-Vue-router实现音乐导航菜单切换
  6. NetCore 依赖注入之服务之间的依赖关系
  7. vue indev.html,webpack - Can't add script tag to Vue component files ( *.vue ) - Stack Overflow
  8. 云主机开放端口笔记-mysql远程连接需要的步骤
  9. c语言24点游戏代码回法,C语言解24点游戏程序
  10. Java基础学习总结(119)——Java8 JVM与Java7 JVM比较
  11. eclipse 统计代码行数
  12. 《分布式系统:概念与设计》一2.3.1 体系结构元素
  13. linux shadow文件如何拷贝,Linux如何查找shadow文件进入?这样几步轻松搞定!
  14. IOS关于UIViewController之间的切换
  15. android activity根节点addview_Android嵌入到页面中的加载动画工具类
  16. 小程序的购物商城源码(前端+后端)
  17. 《SOA中国路线图》可圈可点之处
  18. 【历史上的今天】8 月 9 日:人工智能理论的奠基者诞生;鸿蒙 OS 发布;“云计算”概念被提出
  19. Wireshark入门与进阶系列(二)
  20. 集成MOB 社会分享遇到的坑

热门文章

  1. YOGA触控屏开启和关闭的操作方法
  2. window.print() 去掉页眉页脚及打印链接
  3. 猴子吃桃子c语言编程流程图,C语言实现 猴子吃桃子问题 超级详解
  4. 【笔记】行测——语句表达总结与归纳
  5. linux下的C语言开发
  6. Java练习题一【数据类型,运算符】
  7. mmkv原理,大牛耗时一年最佳总结,让你的app体验更丝滑!附答案
  8. python透视变换原理_opencv透视变换原理及实例
  9. kurento教程_如何使用WebRTC和Kurento媒体服务器,来建立视频会议App(一)
  10. mysql执行语句时c盘突然占满_C盘突然变满了,怎么办?