java 中不同步的意思_“同步”是什么意思?

我对synchronized关键字的用法和重要性有一些疑问。

synchronized关键字的意义是什么?

方法应何时synchronized ?

从程序上和逻辑上是什么意思?

#1楼

据我了解,同步基本上意味着编译器在您的方法周围编写了monitor.enter和monitor.exit。 因此,根据使用方式的不同,它可能是线程安全的(我的意思是,您可以使用同步方法编写对象,而同步方法根据类的用途不是线程安全的)。

#2楼

synchronized关键字是关于不同线程读写相同变量,对象和资源的全部内容。 这不是Java中的琐碎话题,但以下是Sun的引文:

synchronized方法提供了一种防止线程干扰和内存一致性错误的简单策略:如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都将通过同步方法完成。

简而言之:当您有两个线程正在读取和写入同一个“资源”时,说一个名为foo的变量,您需要确保这些线程以原子方式访问该变量。 如果没有synchronized关键字,线程1可能看不到对foo进行的更改线程2,或者更糟的是,它可能只更改了一半。 这在逻辑上不会是您所期望的。

同样,这是Java中不平凡的主题。 要了解更多信息,请在SO和Internet上探索有关以下主题:

继续探索这些主题,直到名称“ Brian Goetz”与大脑中的“并发”一词永久关联。

#3楼

synchronized关键字使线程在进入方法时获得锁,因此只有一个线程可以同时执行该方法(对于给定的对象实例,除非它是静态方法)。

这通常被称为使类具有线程安全性,但是我会说这是委婉的说法。 虽然同步确实可以保护Vector的内部状态免于损坏,但这通常对Vector的用户没有多大帮助。

考虑一下:

if (vector.isEmpty()){

vector.add(data);

}

即使所涉及的方法是同步的,由于它们是分别锁定和解锁的,所以两个不幸的是,定时线程可以创建带有两个元素的向量。

因此,实际上,您还必须同步您的应用程序代码。

因为方法级同步a)不需要时昂贵,并且b)需要同步时不够,所以现在存在非同步的替换(对于Vector,则为ArrayList)。

最近,并发程序包已发布,其中包含许多巧妙的实用程序,可解决多线程问题。

#4楼

可以将其视为一种旋转门,就像您在足球场上可能会发现的那样。 有很多人想进入,但是在旋转门上他们是“同步的”。 一次只能一个人通过。 所有想要通过的人都会做,但是他们可能必须等到可以通过。

#5楼

同步简单意味着没有两个线程可以同时访问该块/方法。 当我们说一个类的任何块/方法都已同步时,这意味着一次只能有一个线程可以访问它们。 在内部尝试访问它的线程首先对该对象进行锁定,只要该锁定不可用,其他线程就无法访问该类实例的任何同步方法/块。

请注意,另一个线程可以访问未定义为同步的同一对象的方法。 线程可以通过调用来释放锁

Object.wait()


版权声明:本文为weixin_39740272原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。