【发布时间】:2015-02-12 03:35:59
【问题描述】:
面试时有人问我:伪代码没问题
//Assume you have a list or A Queue
//1 - How do you make Sure pushing to list is safe?
//1 - My Ans:
void push(Element e){
Synchronized(this){
list.push(e);
}
}
//2- Interviewer said Ok, there is better way to do this without Synchronized word
void push(Element e){
writeLock.Lock();
list.push(e);
writeLock.UnLock();
}
//3- He said Ok, but wouldn't work if there are 16 threads, How can I make sure only one thread can write? His answer was more like a "Semaphore"
void push(Element e){
readLock.lock(16), //meaning get read lock on all 16 thrds
writeLock.Lock(); //then allow to write
list.push(e);
writeLock.UnLock();
readLock.Unlock()
}
我不确定我是否理解他在#3 的解决方案,有人愿意解释和详细说明吗?
【问题讨论】:
-
如果他说的是
ReadWriteLock,那他就错了。 “只要没有写者,读锁可能被多个读线程同时持有。写锁是独占的。” -
目前还不清楚
readLock.lock(16)应该是什么意思。这个问题不能一概而论。答案 100% 取决于特定类的语义是什么。您必须使用更具体的示例来编辑您的问题,否则没有答案。 -
我认为这是一个伪代码。问题是关于概念的
-
@HamedMoghaddam 问题不能与概念有关。正确答案完全取决于 API 的语义。 Java中存在不同语义的API这一事实证明了这一点。
-
@EJP 在问题的第一行我看到“伪代码没问题”。这在上下文中尚不清楚,但在我看来 user1529412 意味着它不是确切的代码。这就是为什么我认为这段代码不一定是面试中问到的确切代码,它可能是一个概念性问题
标签: java multithreading locking java.util.concurrent