首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >同步的Getter和Setter

同步的Getter和Setter
EN

Stack Overflow用户
提问于 2012-02-12 16:59:20
回答 4查看 904关注 0票数 2

我现在正在研究Java并发性。我有一个关于synchronized和锁的问题。

对于任何可变数据,我们应该将所有访问数据的方法放在同一个锁中。

但是,同样的锁意味着什么呢?

示例:

代码语言:javascript
运行
复制
public class SynchronizedInteger{
    private int value;
    public synchronized int get(){return value;}
    public synchronized void set(int value){this.value=value;}
}

所以,我的问题是,为什么这两个方法在同一个锁中?我知道他们是,但我想知道为什么?而且,这是否意味着类中的所有同步方法都在同一个锁中?

编辑:

所以,如果我再给这个类添加一个方法:

代码语言:javascript
运行
复制
 `public synchronized void printOneToHunder(){` 
代码语言:javascript
运行
复制
for(int i=0;i<100;i++) System.out.println(i);

}

此方法也将包含在与setter和getter相同的块中?那么,当有一个线程使用setter或getter时,其他线程不能运行此方法吗?

并且,如果我将类更改为以下内容:

代码语言:javascript
运行
复制
public class SynchronizedInteger{
    private int value1;
    private int value2;
    public synchronized int get1(){return value1;}
    public synchronized void set1(int value){this.value1=value1;}
    public synchronized int get2(){return value2;}
    public synchronized void set2(int value){this.value2=value2;}       
}

据我目前所知,一次只有一个线程可以调用这些方法。那么,如何让一个线程可以修改value1,另一个线程可以修改value2呢?

非常感谢您的友好澄清!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-12 17:04:53

声明为synchronized的所有非静态方法的行为本质上就像代码是:

代码语言:javascript
运行
复制
public synchronized int get() {
  synchronized(this) {
    // the method code
  }
}

即,在this taken上有一个隐式锁。因此,所有非静态同步方法都将锁定调用它们的实例。

静态同步方法会锁定类对象本身,而不是该类的实例。

票数 5
EN

Stack Overflow用户

发布于 2012-02-12 17:04:13

是的,您的两个方法正在使用相同的锁。

不带参数的synchronized关键字被隐式转换为syncrhonized(this),这对于两种方法都是相同的对象。

为了让两个块在java中拥有“相同的锁”,这意味着它们都使用与锁相同的对象。正如我所说的,在您的示例中,这两种方法都使用this作为锁对象。

票数 4
EN

Stack Overflow用户

发布于 2012-02-12 17:04:54

当您声明一个方法synchronized时,这意味着同步是在为其调用该方法的特定实例上进行的。

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

https://stackoverflow.com/questions/9247589

复制
相关文章

相似问题

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