我对synchronized
关键字的用法和重要性有一些疑问。 安全
synchronized
关键字的意义是什么? synchronized
? 据我了解,同步基本上意味着编译器在您的方法周围编写了monitor.enter和monitor.exit。 所以,根据使用方式的不一样,它多是线程安全的(个人意思是,您可使用同步方法编写对象,而同步方法根据类的用途不是线程安全的)。 多线程
synchronized
关键字是关于不一样线程读写相同变量,对象和资源的所有内容。 这不是Java中的琐碎话题,但如下是Sun的引文: 并发
synchronized
方法提供了一种防止线程干扰和内存一致性错误的简单策略:若是一个对象对多个线程可见,则对该对象变量的全部读取或写入都将经过同步方法完成。 spa
简而言之:当您有两个线程正在读取和写入同一个“资源”时,说一个名为foo
的变量,您须要确保这些线程以原子方式访问该变量。 若是没有synchronized
关键字,线程1可能看不到对foo
进行的更改线程2,或者更糟的是,它可能只更改了一半。 这在逻辑上不会是您所指望的。 线程
一样,这是Java中不平凡的主题。 要了解更多信息,请在SO和Internet上探索有关如下主题: code
继续探索这些主题,直到名称“ Brian Goetz”与大脑中的“并发”一词永久关联。 对象
synchronized
关键字使线程在进入方法时得到锁,所以只有一个线程能够同时执行该方法(对于给定的对象实例,除非它是静态方法)。 内存
这一般被称为使类具备线程安全性,可是我会说这是委婉的说法。 虽然同步确实能够保护Vector的内部状态免于损坏,但这一般对Vector的用户没有多大帮助。 资源
考虑一下: get
if (vector.isEmpty()){ vector.add(data); }
即便所涉及的方法是同步的,因为它们是分别锁定和解锁的,因此两个不幸的是,定时线程能够建立带有两个元素的向量。
所以,实际上,您还必须同步您的应用程序代码。
由于方法级同步a)不须要时昂贵,而且b)须要同步时不够,因此如今存在非同步的替换(对于Vector,则为ArrayList)。
最近,并发程序包已发布,其中包含许多巧妙的实用程序,可解决多线程问题。
能够将其视为一种旋转门,就像您在足球场上可能会发现的那样。 有不少人想进入,可是在旋转门上他们是“同步的”。 一次只能一我的经过。 全部想要经过的人都会作,可是他们可能必须等到能够经过。
同步简单意味着没有两个线程能够同时访问该块/方法。 当咱们说一个类的任何块/方法都已同步时,这意味着一次只能有一个线程能够访问它们。 在内部尝试访问它的线程首先对该对象进行锁定,只要该锁定不可用,其余线程就没法访问该类实例的任何同步方法/块。
请注意,另外一个线程能够访问未定义为同步的同一对象的方法。 线程能够经过调用来释放锁
Object.wait()