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()).如果我错了,请纠正我.
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()
是互斥