为什么同步对象仍然可以被操作

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)所以其他线程无法获得相同的锁。结果,块内的代码只能同时由一个线程执行。