问答文章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

我来回答

1个回答

热心网友 时间:2023-10-06 05:07

一般有两种方法 同步方法和同步代码块

假设P1、P2是同一个类的不同对象,这个类中定义了以下几种情况的同步块或同步方法,P1、P2就都可以调用它们。

1. 把synchronized当作函数修饰符时,示例代码如下:

Public synchronized void methodAAA()

{

//….

}

这也就是同步方法,那这时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,它们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任意调用这个被加了synchronized关键字的方法。

上边的示例代码等同于如下代码:

public void methodAAA()

{

synchronized (this) // (1)

{

//…..

}

}

(1)处的this指的是什么呢?它指的就是调用这个方法的对象,如P1。可见同步方法实质是将synchronized作用于object reference。――那个拿到了P1对象锁的线程,才可以调用P1的同步方法,而对P2而言,P1这个锁与它毫不相干,程序也可能在这种情形下摆脱同步机制的控制,造成数据混乱:(

2.同步块,示例代码如下:

public void method3(SomeObject so)

{

synchronized(so)

{

//…..

}

}

这时,锁就是so这个对象,谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁:

class Foo implements Runnable

{

private byte[] lock = new byte[0]; // 特殊的instance变量

Public void methodA()

{

synchronized(lock) { //… }

}

//…..

}

注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。

3.将synchronized作用于static 函数,示例代码如下:

Class Foo

{

public synchronized static void methodAAA() // 同步的static 函数

{

//….

}

public void methodBBB()

{

synchronized(Foo.class) // class literal(类名称字面常量)

}

}

代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。

记得在《Effective Java》一书中看到过将 Foo.class和 P1.getClass()用于作同步锁还不一样,不能用P1.getClass()来达到锁这个Class的目的。P1指的是由Foo类产生的对象。

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