为什么同步对象仍然可以被操作
why synchronized object can still be manipulated
如下代码片段:
List<String> list = new ArrayList<>();
public void addValue(int i) {
synchronized (list) {
list.add("list" + i);
}
}
我的问题是什么被关键字synchronized
锁定了。
当两个线程要求执行代码块时,list
会检查什么?
同样的问题是我同步了this
但是它的字段还是可以改的
同步块被锁定。代码运行时,线程并没有锁定对象,而是获得了对象的锁,list
对象(对象头中的一个markword)所以其他线程无法获得相同的锁。结果,块内的代码只能同时由一个线程执行。
如下代码片段:
List<String> list = new ArrayList<>();
public void addValue(int i) {
synchronized (list) {
list.add("list" + i);
}
}
我的问题是什么被关键字synchronized
锁定了。
当两个线程要求执行代码块时,list
会检查什么?
同样的问题是我同步了this
但是它的字段还是可以改的
同步块被锁定。代码运行时,线程并没有锁定对象,而是获得了对象的锁,list
对象(对象头中的一个markword)所以其他线程无法获得相同的锁。结果,块内的代码只能同时由一个线程执行。