AAA*_*AAA 1 java multithreading synchronization
假设我们有一个带有两个同步块的类:
class A{
public synchronized void methodA{
// Do Something
}
public synchronized void methodB{
// Do Something
}
}
Run Code Online (Sandbox Code Playgroud)
假设我们有两个线程t1并t2共享同一个 class 实例A。Ift1将methodA使用其类的实例进行调用A,同时t2将使用所使用的methodB类的同一实例进行调用。根据我的理解,使用synchronized方法会被阻止,即使是只使用。这是因为每个对象都有一个锁,并且该锁是由 获取的。那是对的吗 ?如果是,如果我们有两个同步块,我们是否可以得出相同的结论?At1t2methodBt1methodAt1
是的。
这:
synchronized void foo() {
code();
}
Run Code Online (Sandbox Code Playgroud)
是以下的简单简写:
void foo() {
synchronized (this) {
code();
}
}
Run Code Online (Sandbox Code Playgroud)
出于同样的原因,拥有公共字段通常是一个非常糟糕的主意,拥有公共锁(通常this是“公共”,从包外部的代码可以访问它的意义上来说)也是一个非常糟糕的主意。通常最好这样做:
class Example {
private final Object lock = new Object[0];
public void foo() {
synchronized (lock) {
code();
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您将锁公开(例如,使用synchronized或以其他方式锁定您直接控制范围之外的某些代码可以访问的内容),则必须对此进行记录,并非常详细地说明您承诺对该锁做什么和不做什么未来的更新。