【发布时间】:2013-03-01 07:04:42
【问题描述】:
我有一个简单的问题,但很难找到答案。
问题是同步方法是否等于 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;
}
}
}
【问题讨论】:
-
在您的第一个示例中,“一些未锁定的代码”语句仍在
synchronized方法中。这是您的意图还是错字? -
一模一样,看看这个[链接][1][1]:stackoverflow.com/questions/574240/…
标签: java multithreading thread-safety