由多个线程访问synchronizedList

Atu*_*ulm 4 java multithreading

我有一个非常基本的问题SynchronizedList.

让我说我有synchronizedList作为 -

List syncList = Collections.synchronizedList(new ArrayList<>())
Run Code Online (Sandbox Code Playgroud)

现在我的场景是线程A试图访问add()api和线程B试图访问remove()synchronizedList的api.Both线程是否能够同时访问Both(添加和删除)api.

我相信线程不应该同时访问api(add()和remove()).如果我错了,请纠正我.

san*_*hat 6

Both线程是否能够同时访问Both(添加和删除)api.

答案是不.

如果您有机会查看Collections.synchronizedList(List)源代码,您会看到,该方法正在创建名为的静态内部类的实例, SynchronizedList或者SynchronizedRandomAccessList根据List您作为参数发送的类型.

现在这两个静态内部类都扩展了一个名为的公共类SynchronizedCollection,它维护一个mutex对象,所有方法操作都在该对象上进行同步

mutex赋予此对象this,这实际上意味着该mutex对象是相同的返回实例.

由于add()remove()方法是在

synchronized(mutex) {

}
Run Code Online (Sandbox Code Playgroud)

块,线,其执行add(和aquires锁定mutex),不会允许另一个线程来执行remove(由aquiring在同一个锁mutex),因为前者已经已经被锁定mutex.在后者的线程等待,直到被获得前绪mutex得到释放.

所以,是add()remove()互斥