我有一个简单的问题,但很难找到答案。
问题是同步方法是否等于 synchronized(this) - 意味着做相同的锁定。
我想编写减少线程锁定的线程安全代码(不想使用总是同步的方法,但有时只使用部分同步关键部分)。
您能否解释一下这段代码是否相等以及为什么简而言之(简化示例以显示原子问题)?
例子
这个混合锁定代码是否等于下面的蛮力代码:
public class SynchroMixed {
int counter = 0;
synchronized void writer() {
// some not locked code
int newCounter = counter + 1;
// critical section
synchronized(this) {
counter = newCounter;
}
}
synchronized int reader() {
return counter;
}
}
蛮力代码(每个方法都被锁定,包括非关键部分:
public class SynchroSame {
int counter = 0;
synchronized void writer() {
int newCounter = counter + 1;
counter = newCounter;
}
synchronized int reader() {
return counter;
}
}
或者我应该编写这段代码(这肯定是有效的,但更多的是微编码且不清楚)。
public class SynchroMicro {
int counter = 0;
void writer() {
// some not locked code
int newCounter = counter + 1;
// critical section
synchronized(this) {
counter = newCounter;
}
}
int reader() {
synchronized (this) {
return counter;
}
}
}