位置: 编程技术 - 正文

【Java同步块】(java 同步方法和同步代码块区别)

编辑:rootadmin
原文链接 作者:Jakob Jenkov 译者:李同杰Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容:Java同步关键字(synchronzied)实例方法同步静态方法同步实例方法中同步块静态方法中同步块Java同步示例

推荐整理分享【Java同步块】(java 同步方法和同步代码块区别),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:java中的同步,java 同步方法和同步代码块区别,java 同步代码块和同步方法区别,java同步的概念,java 同步代码块和同步方法区别,java同步的概念,java 同步块,java 同步块,内容如对您有帮助,希望把文章链接给更多的朋友!

Java 同步关键字(synchronized)

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

有四种不同的同步块:

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

上述同步块都同步在不同对象上。实际需要那种同步块视具体情况而定。

实例方法同步

下面是一个同步的实例方法:

public synchronized void add(int value){this.count &#;= value;}复制代码

注意在方法声明中同步(synchronized )关键字。这告诉Java该方法是同步的。

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

静态方法同步

静态方法同步和实例方法同步方法一样,也使用synchronized 关键字。Java静态方法同步如下示例:

public static synchronized void add(int value){count &#;= value;}复制代码

同样,这里synchronized 关键字告诉Java这个方法是同步的。

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

对于不同类中的静态同步方法,一个线程可以执行每个类中的静态同步方法而无需等待。不管类中的那个静态同步方法被调用,一个类只能由一个线程同时执行。

实例方法中的同步块

【Java同步块】(java 同步方法和同步代码块区别)

有时你不需要同步整个方法,而是同步方法中的一部分。Java可以对方法的一部分进行同步。

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

public void add(int value){ synchronized(this){ this.count &#;= value; } }复制代码

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

注意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实例对象上,那么两个方法可以被线程同时执行。

静态方法中的同步块

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

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这个对象上。那么这两个方法可以同时被线程访问。

Java同步实例

在下面例子中,启动了两个线程,都调用Counter类同一个实例的add方法。因为同步在该方法所属的实例上,所以同时只能有一个线程访问该方法。

public class Counter{ long count = 0;public synchronized void add(long value){ this.count &#;= value; } }public class CounterThread extends Thread{ protected Counter counter = null; public CounterThread(Counter counter){ this.counter = counter; } public void run() { for(int i=0; i<; i&#;&#;){ counter.add(i); } } } public class Example { public static void main(String[] args){ Counter counter = new Counter(); Thread threadA = new CounterThread(counter); Thread threadB = new CounterThread(counter); threadA.start(); threadB.start(); } }复制代码

创建了两个线程。他们的构造器引用同一个Counter实例。Counter.add方法是同步在实例上,是因为add方法是实例方法并且被标记上synchronized关键字。因此每次只允许一个线程调用该方法。另外一个线程必须要等到第一个线程退出add()方法时,才能继续执行方法。

如果两个线程引用了两个不同的Counter实例,那么他们可以同时调用add()方法。这些方法调用了不同的对象,因此这些方法也就同步在不同的对象上。这些方法调用将不会被阻塞。如下面这个例子所示:

public class Example { public static void main(String[] args){ Counter counterA = new Counter(); Counter counterB = new Counter(); Thread threadA = new CounterThread(counterA); Thread threadB = new CounterThread(counterB); threadA.start(); threadB.start(); }}复制代码注意这两个线程,threadA和threadB,不再引用同一个counter实例。CounterA和counterB的add方法同步在他们所属的对象上。调用counterA的add方法将不会阻塞调用counterB的add方法。

批处理一键打包apk 经过了4-5个小时的激烈斗争终于把批处理整出来了,修改里面的链接地址,然后双击即可打包。批处理会自动替换两个common文件中的地址,并调用ant命

深入理解Android消息处理系统——Looper、Handler、Thread 深入理解Android消息处理系统——Looper、Handler、Thread熟悉Windows编程的朋友可能知道Windows程序是消息驱动的,并且有全局的消息循环系统。而Android应用程

Android Studio 无法在可视化页面预览布局文件 java.lang.ClassNotFoundException:android.support.v4.view.ViewPropertyAnimatorListener解决办法:把你的style文件中theme改一下在Theme.AppCompat.Light.DarkActionBar前面加上Base.如下

标签: java 同步方法和同步代码块区别

本文链接地址:https://www.jiuchutong.com/biancheng/379648.html 转载请保留说明!

上一篇:解决android开发在大屏手机图片出现内存溢出(安卓开发常见问题解决)

下一篇:批处理一键打包apk(批处理文件)

  • 小规模纳税人转一般纳税人
  • 增值税小规模纳税人申报表填表说明
  • 交易性金融资产的交易费用计入哪里
  • 建筑工程发票来自哪里
  • 成本核算的三种基本方法
  • 建筑行业分包款要分项目扣除吗
  • 砂石行业一般纳税人税率多少?能简易征收吗?
  • 公司开办期间的装修费怎么会计处理
  • 退税发票认证流程
  • 酒店收取的赔偿费是什么
  • 事业基金转入哪个科目
  • 出纳工人借支与贷款区别
  • 个税全年一次性奖金单独计税
  • 进口代收业务
  • 出售生产线计入哪里
  • 未开票收入已缴税额怎么入账
  • 以资抵债是利空还是利好
  • 支付劳务收入怎么做账
  • 应交增值税进项税额转出借贷方向表示什么
  • 技术开发合同免征企业所得税吗
  • 汽车折旧年限与什么有关
  • 流转税税额
  • 跨年租金收入会计分录
  • 一般纳税人未达到起征点要交税吗
  • 简易计税方法的适用范围
  • 企业白条报销和采取措施
  • 专项储备属于利润分配吗
  • 企业风险报酬转移怎么理解
  • 计提外币借款利息
  • 毛利率与净利率的差额
  • 无法启动个人热点iphone
  • u盘中毒症状
  • php常用函数
  • 呆滞品报废入什么科目
  • 政府性基金收入来源
  • 税款滞纳金会计科目
  • 稿酬所得计入什么科目
  • 微信h5页面设计
  • 企业汇算清缴发现之前收入记多了可以调整吗
  • 【AIGC】6、Segment Anything | Meta 推出超强悍可分割一切的模型 SAM
  • gpt参数
  • 会计账的银行存款与银行存款不一致 是属于账账不符吗
  • 绿化苗木抵扣税是多少
  • 将本月发生的制造费用在甲、乙产品之间
  • 一般纳税人普票可以抵扣吗
  • js let与var区别
  • 换货公司是否可信?
  • 长期股权投资处置损失计入什么科目
  • 报销人和经办人的含义
  • sql server join
  • 员工报销货款会计分录怎么写
  • 固定资产3%减按2%征收增值税申报表如何填写
  • 房屋租赁合同印花税怎么计算
  • 装修费应该按几折算
  • 工程材料如何管理
  • 微信支付的账务在哪里
  • 业务招待费礼品要扣个税吗
  • 不能抵扣的进项税怎么做账务处理
  • 无工资支出企业账务处理
  • sqlserver数据类型怎么用
  • 怎么彻底卸载visual
  • winxp如何将桌面文件默认到d盘
  • centos7 rpm包安装
  • win7系统禁止更新
  • win7更新8007000e
  • win8系统保护已关闭 如何系统还原
  • 【新功能】“回调特性”的使用教程:
  • android学习路线
  • unity怎么设置多个关卡
  • 简述javascript的主要特点
  • angularjs常用总结
  • javascript设置字体
  • javascript要学到什么程度
  • js setimmediate
  • jquery?
  • python的了解
  • ca证书登录不了网厅怎么办
  • 税务登录 河北省地方税务局
  • 电子税务局使用率低的原因
  • 卷筒纱窗拆卸
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设