全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

java synchronized同步静态方法和同步非静态方法的异同

java synchronized 详解

synchronized关键字有两种用法,一种是只用于方法的定义中,另外一种是synchronized块,我们不仅可以使用synchronized来同步一个对象变量,你也可以通synchronizedl来同步类中的静态方法和非静态方法。

synchronized块的语法如下:

public void method() 
{ 
  synchronized(表达式) 
   { 
   } 
 
} 

public void method() 
{ 
  synchronized(表达式) 
   { 
   } 
 
} 

第一种:非静态方法的同步

从Java相关语法可以知道使用synchronized关键字来定义方法就会锁定类中所用使用synchroniezd关键字定义的静态方法和非静态方法,但是这有点不好理解,如果要synchronized块,来达到这样的效果,就不难理解为什么会产生这种效果了,如果使用synchronized来锁定类中所有的同步非静态方法,只需要使用this作为synchronized块的参数传入synchronized块中,代码如下:

  通过synchronized块来同步非静态方法

在上面的代码中的method1使用了synchronized块,method2方法是用了synchronized关键字来定义方法,如果使用同一个Test实例时,这两个方法只要有一个在执行,其他的方法都会因未获得同步锁而被堵塞。除了使用this作为synchronized块的参数,也可以使用Test.this作为synchronized块的参数来达到同样的效果。

public class Test 
{ 
 public void method1() 
 { 
  synchronized(this) 
   { 
 
   } 
 } 
 
 public synchronized void method2() 
 { 
 
 } 
} 
public class Test 
{ 
 public void method1() 
 { 
  synchronized(this) 
   { 
 
   } 
 } 
 
 public synchronized void method2() 
 { 
 
 } 
} 

 在内类中使用synchronized块中,this只表示内类,和外类(OuterClass)没有关系。但是内类中的非静态方法和外类的非静态方法也可以同步。如果在内类中加个方法method3也可以使和Test里面的2个方法同步,代码如下:

public class Test 
{ 
 class InnerClass 
 { 
  public void method3() 
   { 
    synchronized(Test.this){ 
 
    } 
   } 
  } 
} 
public class Test 
{ 
 class InnerClass 
 { 
  public void method3() 
   { 
    synchronized(Test.this){ 
 
    } 
   } 
  } 
} 

上面InnerClass的method3方法与Test的method1和method2方法在同一时间内只能有一个方法执行。

synchronized块不管是正确执行完,还是因为程序出错因异常退出synchronized块,当前的synchronized块所持有的同步锁都会自动释放,因此在使用synchronized块不必担心同步锁的问题。

二、静态方法的同步

由于在调用静态方法时,对象实例不一定被创建,因此,就不能使用this来同步静态方法,而必须使用Class对象来同步静态方法。代码如下:

public class Test{ 
 
 pubic static void method1(){ 
  synchronized(Test.class){ 
  } 
 } 
 public static synchronized void method2(){ 
 
  } 
} 
public class Test{ 
 
 pubic static void method1(){ 
  synchronized(Test.class){ 
  } 
 } 
 public static synchronized void method2(){ 
 
  } 
} 

在同步静态方法时可以使用类的静态字段class来得到class对象,在上例中method1和method2方法只有一个方法执行,除了使用class字段可以得到class对象,还可以通过实例的getClass()方法获取class对象,代码如下:

public class Test{ 
 public static Test test; 
 public Test(){ 
 test=this; 
 } 
 public static void method1(){ 
 synchronized(test.getClass()){ 
 } 
 } 
} 
public class Test{ 
 public static Test test; 
 public Test(){ 
 test=this; 
 } 
 public static void method1(){ 
 synchronized(test.getClass()){ 
 } 
 } 
} 

在上面的代码中,我们通过一个public的静态对象得到Test的一个实例,并通过这个实例的getClass方法获取一个class对象(注意一个类的所有实例通过getClass方法得到的都是同一个Class对象)。我们也可以通过class使不同类的静态方法同步,代码如下:

Test类中的方法和Test1类中方法同步。

public class Test1{ 
 public static void method1(){ 
 synchronized(Test.class){ 
  } 
 } 
} 
public class Test1{ 
 public static void method1(){ 
 synchronized(Test.class){ 
  } 
 } 
} 

注意:在使用synchronized块来同步方法时,非静态方法可以通过this来同步,而静态方法必须使用class对象来同步,但是非静态方法也可以通过使用class来同步静态方法。但是静态方法中不能使用this来同步非静态方法。这点在使用synchronized块需要注意。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# java  # synchronized  # 详解  # 实例详解  # Java多线程synchronized同步方法详解  # java中synchronized(同步代码块和同步方法)详解及区别  # Java使用synchronized修饰方法来同步线程的实例演示  # Java中synchronized关键字修饰方法同步的用法详解  # Java synchronized同步方法详解  # 类中  # 可以通过  # 可以使用  # 在上面  # 都是  # 就会  # 还可以  # 其他的  # 这两个  # 时间内  # 用了  # 希望能  # 就不能  # 只有一个  # 只需要  # 有两种  # 谢谢大家  # 在上  # 可以得到  # 所持 


相关文章: c# await 一个已经完成的Task会发生什么  自助网站制作软件,个人如何自助建网站?  黑客如何利用漏洞与弱口令入侵网站服务器?  c++ stringstream用法详解_c++字符串与数字转换利器  制作网站的公司有哪些,做一个公司网站要多少钱?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  焦点电影公司作品,电影焦点结局是什么?  如何在云主机上快速搭建网站?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  北京建设网站制作公司,北京古代建筑博物馆预约官网?  南平网站制作公司,2025年南平市事业单位报名时间?  长沙做网站要多少钱,长沙国安网络怎么样?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  建站主机选购指南与交易推荐:核心配置解析  如何零基础在云服务器搭建WordPress站点?  如何制作一个表白网站视频,关于勇敢表白的小标题?  建站之星后台密码遗忘或太弱?如何重置与强化?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  建站之星好吗?新手能否轻松上手建站?  如何通过FTP服务器快速搭建网站?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  如何快速完成中国万网建站详细流程?  制作企业网站建设方案,怎样建设一个公司网站?  寿县云建站:智能SEO优化与多行业模板快速上线指南  建站主机解析:虚拟主机配置与服务器选择指南  表情包在线制作网站免费,表情包怎么弄?  建站之星收费标准详解:套餐费用及年费价格表一览  建站之星备案流程有哪些注意事项?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  如何注册花生壳免费域名并搭建个人网站?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  C++如何编写函数模板?(泛型编程入门)  代刷网站制作软件,别人代刷火车票靠谱吗?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  网站图片在线制作软件,怎么在图片上做链接?  制作网站的软件免费下载,免费制作app哪个平台好?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  建站主机SSH密钥生成步骤及常见问题解答?  实现虚拟支付需哪些建站技术支撑?  简单实现Android验证码  弹幕视频网站制作教程下载,弹幕视频网站是什么意思? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。