我对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()