Java同步

use*_*ser 7 java multithreading thread-safety

这是什么:

synchronized (this) {
    // ...some code...
}
Run Code Online (Sandbox Code Playgroud)

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

T.J*_*der 16

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


Bri*_*new 13

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

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

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

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


Jes*_*per 11

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

synchronized void someMethod() {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

void someMethod() {
    synchronized (this) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)