全网整合营销服务商

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

免费咨询热线: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同步方法详解  # 类中  # 可以通过  # 可以使用  # 在上面  # 都是  # 就会  # 还可以  # 其他的  # 这两个  # 时间内  # 用了  # 希望能  # 就不能  # 只有一个  # 只需要  # 有两种  # 谢谢大家  # 在上  # 可以得到  # 所持 


相关文章: 如何高效利用200m空间完成建站?  建站之星后台密码遗忘如何找回?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  网站制作服务平台,有什么网站可以发布本地服务信息?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  如何在阿里云ECS服务器部署织梦CMS网站?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  如何通过虚拟机搭建网站?详细步骤解析  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  如何在IIS中新建站点并配置端口与物理路径?  如何在Windows服务器上快速搭建网站?  如何通过云梦建站系统实现SEO快速优化?  如何通过NAT技术实现内网高效建站?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  如何选择高效稳定的ISP建站解决方案?  如何选择CMS系统实现快速建站与SEO优化?  如何通过宝塔面板实现本地网站访问?  如何挑选优质建站一级代理提升网站排名?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  已有域名如何快速搭建专属网站?  制作农业网站的软件,比较好的农业网站推荐一下?  如何选购建站域名与空间?自助平台全解析  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  建站之星×万网:智能建站系统+自助建站平台一键生成  网站制作的步骤包括,正确网址格式怎么写?  如何高效完成独享虚拟主机建站?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  建站之星安装步骤有哪些常见问题?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  网站制作公司排行榜,抖音怎样做个人官方网站  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  小建面朝正北,A点实际方位是否存在偏差?  如何注册花生壳免费域名并搭建个人网站?  如何在IIS中新建站点并解决端口绑定冲突?  如何快速生成橙子建站落地页链接?  ,巨量百应是干嘛的?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  如何在服务器上三步完成建站并提升流量?  如何选择香港主机高效搭建外贸独立站?  个人摄影网站制作流程,摄影爱好者都去什么网站?  如何快速打造个性化非模板自助建站?  如何快速生成ASP一键建站模板并优化安全性?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  视频网站制作教程,怎么样制作优酷网的小视频?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  微信推文制作网站有哪些,怎么做微信推文,急?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一) 

您的项目需求

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