我现在正在研究Java并发性。我有一个关于synchronized和锁的问题。
对于任何可变数据,我们应该将所有访问数据的方法放在同一个锁中。
但是,同样的锁意味着什么呢?
示例:
public class SynchronizedInteger{
private int value;
public synchronized int get(){return value;}
public synchronized void set(int value){this.value=value;}
}所以,我的问题是,为什么这两个方法在同一个锁中?我知道他们是,但我想知道为什么?而且,这是否意味着类中的所有同步方法都在同一个锁中?
编辑:
所以,如果我再给这个类添加一个方法:
`public synchronized void printOneToHunder(){` for(int i=0;i<100;i++) System.out.println(i);}
此方法也将包含在与setter和getter相同的块中?那么,当有一个线程使用setter或getter时,其他线程不能运行此方法吗?
并且,如果我将类更改为以下内容:
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呢?
非常感谢您的友好澄清!
发布于 2012-02-12 17:04:53
声明为synchronized的所有非静态方法的行为本质上就像代码是:
public synchronized int get() {
synchronized(this) {
// the method code
}
}即,在this taken上有一个隐式锁。因此,所有非静态同步方法都将锁定调用它们的实例。
静态同步方法会锁定类对象本身,而不是该类的实例。
发布于 2012-02-12 17:04:13
是的,您的两个方法正在使用相同的锁。
不带参数的synchronized关键字被隐式转换为syncrhonized(this),这对于两种方法都是相同的对象。
为了让两个块在java中拥有“相同的锁”,这意味着它们都使用与锁相同的对象。正如我所说的,在您的示例中,这两种方法都使用this作为锁对象。
发布于 2012-02-12 17:04:54
当您声明一个方法synchronized时,这意味着同步是在为其调用该方法的特定实例上进行的。
https://stackoverflow.com/questions/9247589
复制相似问题