有两种方法(一种是同步另一种方法)和两种线程

时间:2014-01-30 15:14:58

标签: java multithreading synchronization

如果对象的一个​​方法是同步的而另一个方法不同步,那么两个不同的线程可以同时运行它们吗?我知道当一个方法被标记为同步时,必须获取内部锁,但第二种方法不同步,这有关系吗?或者,如果一个线程获得锁定,则无法输入所有方法?

2 个答案:

答案 0 :(得分:1)

是。两个线程可以同时执行这两个方法。线程可以锁定同步方法,但执行非同步方法不需要锁定。

答案 1 :(得分:1)

我确信这两个方法可以在同一个对象上同时运行,因为synchronized的方法只能使用该对象的内部锁。获得它,但由于非同步方法不能使用锁,它们都可以同时运行。我遇到了同样的场景&发现约会陈述是正确的。有关更清晰的信息,请参阅以下示例:

class LockTest {

    // Sync Method. Will acquire the lock
    public synchronized void meth1() {
        System.out.println(Thread.currentThread().getName()
                + " is executing method1.");
        try {
            Thread.sleep(1000); // to show some processing, Won't release the
                                // lock
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out
                .println(Thread.currentThread().getName() + " ended method1.");
    }

    // No lock is required in this method
    public void meth2() {
        try {
            Thread.sleep(1);// to let meth1 execute first & acquire the lock
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()
                + " is executing method2.");
        System.out
                .println(Thread.currentThread().getName() + " ended method2.");
    }

    public static void main(String[] args) throws Exception {
        final LockTest oracle = new LockTest();
        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                oracle.meth1();

            }
        }, "BigThread");

        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                oracle.meth2();

            }
        }, "SmallThread");

        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
}

上面的代码生成输出为:

BigThread is executing method1.
SmallThread is executing method2.
SmallThread ended method2.
BigThread ended method1.

输出显示method2执行时method1同时也在同一个对象oracle上执行。