【问题标题】:Synchronized a single method between two threads在两个线程之间同步单个方法
【发布时间】:2013-11-14 09:19:45
【问题描述】:

我想在线程中更新一个文件。我为updateXML(); 创建了一个单独的方法。 Thread1 和 Thread2 都在调用相同的方法。我只希望一个方法调用该方法,另一个等待。

【问题讨论】:

  • 嗯.. 答案取决于你的问题的标题。

标签: java multithreading wait synchronized


【解决方案1】:
synchronized void updateXML() {
    /* ... */
}

不过,这也会锁定该类的其他 synchronized 方法。如有必要,您可以使用锁定对象:

private final Object updateXmlLock = new Object();

void updateXML() {
    synchronized(updateXmlLock) {
        /* ... */
    }
}

您可以在 Java 教程中阅读有关 intrinsic lockssynchronized methods 的更多信息。

【讨论】:

    【解决方案2】:

    提取 updateXML() 方法以分离类,而不是在 Runnable 实现中。使此方法成为同步方法。像这样的:

    public class XmlUpdater {
    public synchronized void updateXml() {
        // do something. I imitate work :)
        try {
            System.out.println(Thread.currentThread().getName() + ". Updating XML");
            Thread.sleep(10000);
            System.out.println(Thread.currentThread().getName() + ". Updated successfully");
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    }
    

    现在,创建您的线程或可运行对象,为它们(!!!重要)提供您的 xml 更新类的相同实例。使用它:) 主类示例:

    public class ThreadTest {
    
    
    static class TestRunnable implements Runnable {
    
        private XmlUpdater updater;
    
        TestRunnable(XmlUpdater updater) {
            this.updater = updater;
        }
    
        public void run() {
            updater.updateXml();
        }
    }
    public static void main(String[] args) throws InterruptedException {
        XmlUpdater updater = new XmlUpdater();
    
        //NOTE the updater object is same for two runnables
        Runnable runnable1 = new TestRunnable(updater);
        Runnable runnable2 = new TestRunnable(updater);
        Thread t1 = new Thread(runnable1);
        Thread t2 = new Thread(runnable2);
        System.out.println("Threads started");
        t1.start();
        t2.start();
        t1.join();
        t2.join();
    
        System.out.println("Program ended");
    }
    }
    

    我的输出是:

    Threads started
    Thread-0. Updating XML
    Thread-0. Updated successfully
    Thread-1. Updating XML
    Thread-1. Updated successfully
    

    节目结束

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      相关资源
      最近更新 更多