Java同步

这是什么:

synchronized (this) { // ...some code... } 

好吗? (你能写一个例子吗?)

它可以防止多个线程运行大括号中包含的代码。 当一个线程正在运行该代码时,其余部分将被阻止。 当第一个线程完成时,其中一个被阻塞的线程将运行同步代码,依此类推。

你为什么要这样做? 块内的代码可以修改对象,使得它们处于不一致状态,直到块退出。 所以进入的第二个线程会发现不一致的对象。 从那时起,混乱随之而来。

一个例子是从一个池中删除一个对象并将其插入另一个池中。 第二个线程可能在第一个线程移动对象时运行,然后找到两个集合中引用的对象,或者两者都没有。

您还可以使用此机制来限制多个线程访问旨在由一个资源(例如,普通数据库)使用的资源。

它可以防止对资源的并发访问。 Sun的例子非常好 。

请注意,以下两个是等效的:

 synchronized void someMethod() { // ... } 

 void someMethod() { synchronized (this) { // ... } } 

来自现已解散的Java快速参考,以前在http://www.janeg.ca/scjp/threads/synchronized.html

同步线程具有序列化对线程上运行的代码块的访问的效果。 在此上下文中进行序列化意味着一次为一个线程提供执行特定代码块的权限。