Java关于synchronized同步方法、代码块、静态方法、静态代码块的区别列举说明

2021-12-18 0 1,011

Java中的同步块用synchronized标记,是同步在某个对象上,所有同步在一个对象上的同步块在同一时刻只能被一个线程进入并执行操作,其他等待进入该同步块的线程将被阻塞,直到执行该同步块中的线程退出。 有四种不同的同步块:

实例方法同步; 静态方法同步; 实例方法中的同步块; 静态方法中的同步块。

1.实例方法同步

Java实例方法同步是同步在拥有该方法的对象上。这样,每个实例其方法同步都同步在不同的对象上,即该方法所属的实例。只有一个线程能够在实例方法同步块中运行。如果有多个实例存在,那么一个线程一次可以在一个实例同步块中执行操作。一个实例一个线程。示例代码:

public synchronized void add(int value){
 this.count += value;
}

2.静态方法同步

静态方法的同步是指同步在该方法所在的类对象上。因为在Java虚拟机中一个类只能对应一个类对象,所以同时只允许一个线程执行同一个类中的静态同步方法。

对于不同类中的静态同步方法,一个线程可以执行每个类中的静态同步方法而无需等待,一个类只能由一个线程同时执行。s示例代码:

public static synchronized void add(int value){
 count += value; // count位静态变量
 }

3.实例方法中的同步块

在非同步的Java方法中的同步块的例子如下所示:

public void add(int value){
 synchronized(this){
 this.count += value;
 }
}

示例使用Java同步块构造器来标记一块代码是同步的。该代码在执行时和同步方法一样。

PS:注意Java同步块构造器用括号将对象括起来。在上例中,使用了“this”,即为调用add方法的实例本身。在同步构造器中用括号括起来的对象叫做监视器对象。上述代码使用监视器对象同步,同步实例方法使用调用方法本身的实例作为监视器对象。 一次只有一个线程能够在同步于同一个监视器对象的Java方法内执行。

下面两个例子都同步他们所调用的实例对象上,因此他们在同步的执行效果上是等效的。

public class MyClass {
 
public synchronized void log1(String msg1, String msg2){
log.writeln(msg1);
log.writeln(msg2);
}
 
public void log2(String msg1, String msg2){
synchronized(this){
log.writeln(msg1);
log.writeln(msg2);
}
}
}

在上例中,每次只有一个线程能够在两个同步块中任意一个方法内执行。如果第二个同步块不是同步在this实例对象上,那么两个方法可以被线程同时执行。

4.静态方法中的同步块

下面是两个静态方法同步的例子。这些方法同步在该方法所属的类对象上。

public class MyClass {
 public static synchronized void log1(String msg1, String msg2){
 log.writeln(msg1);
 log.writeln(msg2);
 }
 
 public static void log2(String msg1, String msg2){
 synchronized(MyClass.class){
 log.writeln(msg1);
 log.writeln(msg2);
 }
 }
}

这两个方法不允许同时被线程访问。如果第二个同步块不是同步在MyClass.class这个对象上。那么这两个方法可以同时被线程访问。

5.synchronized(this)、synchronized(object)、synchronized(*.class)区别

下面单独对同步代码块的三种同步写法做一下区别:

(1)、synchronized(this)同步代码块:1)对其它的synchronized同步方法或synchronized(this)同步代码块调用是堵塞状态;2)同一时间只有一个线程执行同一对象的synchronized同步方法中的代码;

(2)、synchronized(object)进行同步操作时,对象监视器必须是同一个对象。不是同一个,运行就是异步执行了;

(3)、synchronized(*.class)代码块的作用其实和synchronized static方法作用一样。Class锁对类其作用,也就是对类所有对象实例起作用。

 

免责声明:本文内容由凌晨学院网转载自互联网,版权归原作者所有,凌晨学院网不拥有其著作权,亦不承担相应法律责任。如果本站侵犯了您的权益请及时联系team@lcwl.fun,核实后本站将会在2个工作日内对涉嫌侵权内容处理完毕!谢谢合作!

收藏 (0) 打赏

感谢您的支持,我们会继续努力的!

打开支付宝/微信/QQ扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

1. 本站所有教学内容和资源均来源于本站原创和网络收集以及用户自主上传,如有侵权请带证联系本站客服进行处理!邮箱:team@lcwl.fun
2. 对于非本站原创的资源不保证所提供下载资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系本站客服处理,有奖励!
3. 除本站原创教学或资源外其余资源您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
4. 本站原创资源如需商用还请申请商业授权,否则本站有权追究其法律责任!
5. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有学币奖励额外收入!

凌晨资源网 开发与运维 Java关于synchronized同步方法、代码块、静态方法、静态代码块的区别列举说明 https://www.lingchenw.cn/jishu/887.html

常见问题
  • 本站所有付费教程均可单独付费或者开会员学习,自己购买或者开了会员就可以学习,来凌晨学院报名学习送会员,并且有讲师一对一辅导培训教学,师生互动化,定期布置作业等
查看详情
  • 本站所有资源版权均属于原作者所有,资源中标注可商用的可以商用的代表是本团队自主研发公布可商用的产品,未标注可商用所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。
查看详情

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务

学习手机编程软件开发
手机编程软件开发

你知道吗?用手机也能开发制作软件,满足自己的编程心,做属于自己的软件

报名学习
自媒体短视频
副业做自媒体短视频

想做自媒体短视频剪辑给自己多一份副业,只需一部手机你也可以

报名学习
搭建网站必备云互联主机
链未云互联

搭建网站,后台云服务等必备云服务器互联主机,IDC云主机

现在使用
Fa快捷助手
用手点一点就能开发做软件

不用记编程语法,不用一行一行手敲代码,用手点一点就能开发制作软件

点击下载