问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java同步方法和同步代码块的区别

发布网友 发布时间:2022-04-22 02:53

我来回答

2个回答

热心网友 时间:2023-12-02 17:26

在Java语言中,每一个对象有一把锁。线程可以使用synchronized关键字来获取对象上的锁。synchronized关键字可应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁)。
问题的由来:
看到这样一个面试题:
//下列两个方法有什么区别public synchronized void method1(){} public void method2(){ synchronized (obj){}}

synchronized用于解决同步问题,当有多条线程同时访问共享数据时,如果进行同步,就会发生错误,Java提供的解决方案是:只要将操作共享数据的语句在某一时段让一个线程执行完,在执行过程中,其他线程不能进来执行可以。解决这个问题。这里在用synchronized时会有两种方式,一种是上面的同步方法,即用synchronized来修饰方法,另一种是提供的同步代码块。
这里总感觉怪怪的,这两种方法有什么区别呢,基础学得不好,于是就动手做了个简单的测试,代码如下:
public class SynObj { public synchronized void methodA() { System.out.println("methodA....."); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } public void methodB() { synchronized(this) { System.out.pritntln("methodB....."); } } public void methodC() { String str = "sss"; synchronized (str) { System.out.println( "methodC....."); } }}
public class TestSyn { public static void main(String[] args) { final SynObj obj = new SynObj(); Thread t1 = new Thread(new Runnable() { @Override public void run() { obj.methodA(); } }); t1.start(); Thread t2 = new Thread(new Runnable() { @Override public void run() { obj.methodB(); } }); t2.start(); Thread t3 = new Thread(new Runnable() { @Override public void run() { obj.methodC(); } }); t3.start(); }}

这段小代码片段打印结果如下:
methodA.....methodC.....//methodB会隔一段时间才会打印出来methodB.....

这段代码的打印结果是,methodA…..methodC…..会很快打印出来,methodB…..会隔一段时间才打印出来,那么methodB为什么不能像methodC那样很快被调用呢?
在启动线程1调用方法A后,接着会让线程1休眠5秒钟,这时会调用方法C,注意到方法C这里用synchronized进行加锁,这里锁的对象是str这个字符串对象。但是方法B则不同,是用当前对象this进行加锁,注意到方法A直接在方法上加synchronized,这个加锁的对象是什么呢?显然,这两个方法用的是一把锁。
*由这样的结果,我们就知道这样同步方法是用什么加锁的了,由于线程1在休眠,这时锁还没释放,导致线程2只有在5秒之后才能调用方法B,由此,可知两种加锁机制用的是同一个锁对象,即当前对象。

另外,同步方法直接在方法上加synchronized实现加锁,同步代码块则在方法内部加锁,很明显,同步方法锁的范围比较大,而同步代码块范围要小点,一般同步的范围越大,性能就越差,一般需要加锁进行同步的时候,肯定是范围越小越好,这样性能更好*。

热心网友 时间:2023-12-02 17:27

在Java语言中,每一个对象有一把锁。线程可以使用synchronized关键字来获取对象上的锁。synchronized关键字可应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁)。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? Java实现同步的几种方式 Java语言包含两哪些同步机制 魅族手机更新系统出错开不了机怎么办 中国移动机顶盒 线怎么插在电视机上 移动电视机顶盒链接电视后怎么调试? ps怎样做火焰文字效果 ps火焰字教程参考 怎样用PS制作火焰字效果 利用PS图层样式制作超酷的双11火焰字 电脑上怎样进行京东实名认证 有好词好句好段吗? 杜牧古诗有哪些 群芳吐艳,姹紫嫣红,落英缤纷,喷薄欲出,皓月当... 描写梅花的诗 有关苏州,拙政园的古诗词 买新车的购置税是按原价计算还是按实际买价计算? 汽车购置税是按指导价还是按实际成交价 仅自己可见状态下的微博可以改成公开吗? 微博设为自己可见之后,还能放开吗? 发表时仅自己可见的微博 以后还可以再进行更改吗 ... Java同步方法和同步块,哪个是更好的选择? java同步机制怎么用啊?jsp里怎么建立同步模块呀? Java类的实例化顺序是什么样的?Java线程同步的方式... java里同步是什么意思 java中什么同步什么是异步分别用在什么地方 java多线程开发的同步机制有哪些 java同步代码块和同步方法的区别 java 方法同步 java.关于线程同步的几个知识点 Java的synchronized的同步代码块和同步方法的区别 JAVA 中的同步机制有什么作用? 手机百度为什么总是下载失败 下载手机百度不了怎么回事 苹果手机百度下载不了啥情况? 腌大蒜苗的做法 自制 大蒜苗怎么腌制好吃 腌蒜苗的做法 自制 腌青蒜苗的做法大全 小龙虾要怎么煮才入味? 吃小龙虾要注意什么?