【问题标题】:thread/synch in javajava中的线程/同步
【发布时间】:2012-03-04 05:17:45
【问题描述】:

我对 Java 非常失望,因为它不允许以下代码尽可能地同时移动。当没有同步时,两个线程更频繁地切换,但是当尝试访问同步方法时,第二个线程获得锁之前需要很长时间(比如 30 秒),而第一个线程获得锁之前又需要很长时间(比如 30 秒)从第二个。哪些编码可以更好地处理共享锁:

   public synchronized static void i()
   {

     System.out.println(Thread.currentThread().getName());

    }
    public static void main(String[] f)
   {

   Thread t = new Thread(new Runnable(){
    public void run()
   {
       while(true)
       i();
     }});
    t.setName("a: ");
    Thread t2 = new Thread(new Runnable(){
     public void run()
     {
       while(true)
        i();
      }});
      t2.setName("b: ");
      t.start();
      t2.start();

    }

【问题讨论】:

    标签: java concurrency


    【解决方案1】:

    使用ReentrantLock,公平设置为true。

    public static final ReentrantLock lock = new ReentrantLock(true);
    public static void i()
    {
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName());
    
        } finally {
            lock.unlock();
        }
    }
    

    【讨论】:

    • 结合 exabrial 和 Chikei 的答案,你就有了完全正确的答案。由于前面提到的原因,默认情况下不保证公平性。但关于交错,我会同意 Chikei 的建议,即使用可以保证一些公平性的锁。如果你想要“完美”的交错,即线程 B 总是在线程 A 之后运行并且在线程 A 被允许再次运行之前运行,你将需要一个不同的锁定方案。
    【解决方案2】:

    问题不在于 java,而在于您的代码。锁定合约的哪一部分意味着公平获取?简单地让现有的锁持有者继续使用会更快更高效;通常他们会完成他们的工作并释放锁。您的程序应该对锁和线程交错的公平性做出 0 假设。

    如果你想要一个公平的交错,你不应该使用同步方法。您需要创建一个私有对象,然后在该私有对象上手动使用 wait() 和 notify() 方法来强制交错,但即使这样也是一个假设:) 为确保获得公平的交错,您必须创建一个volatile 条件变量,指示轮到谁执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多