2009-08-24 80 views
6

是什么:Java同步

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

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

回答

12

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

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

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

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

0

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

同步线程具有顺序访问线程上运行 代码块的作用 。 在此上下文中的序列化意味着 每次给予一个线程权利 执行特定的代码块。

11

注意以下两个是等价的:

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

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