【问题标题】:What is best Practice to use Locks in Java (Interview)?在 Java 中使用锁的最佳实践是什么(采访)?
【发布时间】: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


【解决方案1】:

想法是读者只有在没有写入的情况下才能阅读。换句话说,阅读是免费的同步。所以16个线程可以并发读取。 但是,当您要写入时,您会锁定所有内容(读取和写入进程)并且只进行写入。面试官可能从 ConcurrentHashMap 中获得了这个想法,因为 concurrencyLevel 的默认值为 16。

建议你看看http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多