我正在研究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);
for(int i=0;i<100;i++) System.out.println(i);
这个方法也会被包含在与setter和getter相同的块中?那么,当有一个线程使用setter或getter时,其他线程无法运行此方法?
而且,如果我将课程改为以下内容怎么办?
}
根据我的理解,现在只有一个线程可以同时调用这些方法。那么什么是让一个线程可以修改value1而另一个线程修改value2 ???
的方法非常感谢您的善意澄清!!!!
答案 0 :(得分:5)
您声明synchronized
的所有非静态方法的行为基本上与代码一样:
public synchronized int get() {
synchronized(this) {
// the method code
}
}
即。对this
采取隐式锁定。因此,所有非静态同步方法都将锁定调用它们的实例。
静态同步方法锁定类对象本身,而不是该类的实例。
答案 1 :(得分:4)
是的,你的两种方法都使用相同的锁。
不带参数的synchronized
关键字被隐式转换为syncrhonized(this)
,这两个方法都是同一个对象。
为了让两个块在java中具有“相同的锁”,这意味着它们都使用与锁相同的对象。正如我所说,在您的情况下,两种方法都使用this
作为锁定对象。
答案 2 :(得分:0)
声明方法synchronized
时,意味着同步位于要为其调用方法的特定实例上。
答案 3 :(得分:0)
但是你有其他的同步方式。
同步块:
synchronized(someLockedObj){somecode}
锁定对象:
Lock lock = new ReentrantLock(); lock.lock(); lock.unlock();