锁定java同步方法

时间:2012-12-10 07:55:47

标签: java multithreading synchronization synchronized

我正在尝试使用同步方法编写带有线程的java程序。但是当我在另一个线程调用java中的synchronized方法时,我无法理解如何显示已经运行的线程。任何人都可以用简单的例子来解释

2 个答案:

答案 0 :(得分:3)

这是一个设计的例子,它显示了交错和阻塞过程。在我的机器上打印:

  

Thread [Thread-0,5,main]将调用synchronized方法
  线程[Thread-1,5,main]将调用同步方法
  线程[Thread-0,5,main]在同步方法中   线程[Thread-0,5,main]退出方法
  线程[Thread-1,5,main]在同步方法中   Thread [Thread-1,5,main]正在退出方法

您可以看到只有一个线程进入同步块而另一个线程等待。

public class Test1 {

    public static void main(String[] args) throws Exception {
        final Test1 test = new Test1();
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread() + " is going to call the synchronized method");
                test.method();
            }
        };
        new Thread(r).start();
        new Thread(r).start();
    }

    public synchronized void method() {
        System.out.println(Thread.currentThread() + " is in the synchronized method");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
        }
        System.out.println(Thread.currentThread() + " is exiting the method");
    }
}

答案 1 :(得分:0)

如果我理解正确,你想在线程试图调用同步方法时打印一条消息,而另一个线程已经在执行它。您无法使用同步方法或块执行此操作,但您可以使用java.util.concurrent.locks.Lock接口来执行此操作。您需要的方法是tryLock()。你可以这样做:

public class Test1 {
    private Lock lock = new ReentrantLock();

    // ...

    public void method() {
        if (lock.tryLock()) {
            try {
                // you successfully acquired the lock, do you logic here
            } finally {
                lock.unlock();
            }                
        } else {
            // lock is hold by another thread
            System.out.println("cannot acquire a lock");
        }
    }
}

如果您愿意,可以轻松地演变此示例以打印哪个线程完全保持锁定。