首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java线程同步块行为-同步与同步()?

Java线程同步块行为-同步与同步()?
EN

Stack Overflow用户
提问于 2013-03-13 11:16:00
回答 4查看 460关注 0票数 0

我有一个简单的问题,但有问题要找出答案。

问题是,同步方法是否等于同步(这)--意味着执行相同的锁定.

我希望编写线程安全代码,减少线程锁定(不希望使用始终同步的方法,但有时只使用部分同步临界部分)。

您能解释一下这段代码是否相等吗?为什么用一句话(示例被简化为显示原子问题)?

示例

此混合锁定代码是否等于以下蛮力代码:

代码语言:javascript
复制
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;
    }
}

蛮力代码(每个方法都被锁定,包括非关键部分):

代码语言:javascript
复制
public class SynchroSame {
    int counter = 0;

    synchronized void writer() {
        int newCounter = counter + 1;

        counter = newCounter;
    }

    synchronized int reader() {
        return counter;
    }
}

或者我应该写这段代码(这当然是有效的,但更微观的编码和不清楚)。

代码语言:javascript
复制
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;
        }
    }
}
EN

回答 4

Stack Overflow用户

发布于 2013-03-13 11:18:34

synchronized方法和synchronized(this)意味着完全相同的东西,在后面使用相同的互斥。更多的是关于味道的问题,喜欢哪种符号。

就我个人而言,我更喜欢synchronized(this),因为它显式地指定了互斥锁的作用域,它可能比整个方法要小。

票数 3
EN

Stack Overflow用户

发布于 2013-03-13 11:20:32

synchronized(this)synchronized方法中绝对没有意义,因为输入该方法已经是隐式synchronized(this)

这对您来说只是语法错误,因为您显然打算缩小关键部分的范围,但是缩小的范围会在代码中引入数据竞争:您必须在同一个synchronized块中读取和写入共享变量。

此外,即使方法只读取共享变量,它仍然必须在synchronized块中这样做;否则,它可能永远不会观察其他线程的任何写入。这是Java内存模型的基本语义。

现在,如果您所展示的内容真正代表了您的全部问题,那么您甚至不应该使用synchronized,而应该使用一个简单的AtomicInteger,它具有最好的并发性能。

票数 2
EN

Stack Overflow用户

发布于 2013-03-13 11:21:38

这三个例子都是等价的。在方法上使用synchronized与在synchronized(this) {}中包装整个身体是一样的。

然后,通过对一些语句使用synchronized(this) {},线程只是重新获取它已经拥有的锁:在这里它是没有意义的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15383740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档