“同步”是什么意思?

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

  • synchronized关键字的意义是什么?
  • 方法应什么时候synchronized
  • 从程序上和逻辑上是什么意思?

#1楼

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


#2楼

synchronized关键字是关于不一样线程读写相同变量,对象和资源的所有内容。 这不是Java中的琐碎话题,但如下是Sun的引文: 并发

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

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

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

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


#3楼

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

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

考虑一下: get

if (vector.isEmpty()){
     vector.add(data);
 }

即便所涉及的方法是同步的,因为它们是分别锁定和解锁的,因此两个不幸的是,定时线程能够建立带有两个元素的向量。

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

由于方法级同步a)不须要时昂贵,而且b)须要同步时不够,因此如今存在非同步的替换(对于Vector,则为ArrayList)。

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


#4楼

能够将其视为一种旋转门,就像您在足球场上可能会发现的那样。 有不少人想进入,可是在旋转门上他们是“同步的”。 一次只能一我的经过。 全部想要经过的人都会作,可是他们可能必须等到能够经过。


#5楼

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

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

Object.wait()
相关文章
相关标签/搜索