我有一个简单的问题,但有问题要找出答案。
问题是,同步方法是否等于同步(这)--意味着执行相同的锁定.
我希望编写线程安全代码,减少线程锁定(不希望使用始终同步的方法,但有时只使用部分同步临界部分)。
您能解释一下这段代码是否相等吗?为什么用一句话(示例被简化为显示原子问题)?
示例
此混合锁定代码是否等于以下蛮力代码:
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;
}
}
}发布于 2013-03-13 11:18:34
synchronized方法和synchronized(this)意味着完全相同的东西,在后面使用相同的互斥。更多的是关于味道的问题,喜欢哪种符号。
就我个人而言,我更喜欢synchronized(this),因为它显式地指定了互斥锁的作用域,它可能比整个方法要小。
发布于 2013-03-13 11:20:32
synchronized(this)在synchronized方法中绝对没有意义,因为输入该方法已经是隐式synchronized(this)。
这对您来说只是语法错误,因为您显然打算缩小关键部分的范围,但是缩小的范围会在代码中引入数据竞争:您必须在同一个synchronized块中读取和写入共享变量。
此外,即使方法只读取共享变量,它仍然必须在synchronized块中这样做;否则,它可能永远不会观察其他线程的任何写入。这是Java内存模型的基本语义。
现在,如果您所展示的内容真正代表了您的全部问题,那么您甚至不应该使用synchronized,而应该使用一个简单的AtomicInteger,它具有最好的并发性能。
发布于 2013-03-13 11:21:38
这三个例子都是等价的。在方法上使用synchronized与在synchronized(this) {}中包装整个身体是一样的。
然后,通过对一些语句使用synchronized(this) {},线程只是重新获取它已经拥有的锁:在这里它是没有意义的。
https://stackoverflow.com/questions/15383740
复制相似问题