繁体   English   中英

在同一实例上使用同步方法锁定

[英]Locking with synchronized method on same instance

我正在运行以下代码:

public class SyncMethods {

    public static void main(String... args) {
        new SyncMethods().syncMethodsInvoker();
    }

    public void syncMethodsInvoker() {

        System.out.println("inside syncMethodsInvoker()");

        Thread t1 = new SyncMethodThread(this);
        Thread t2 = new SyncMethodThread(this);
        t1.start();
        t2.start();
        try {
            t1.join();
            t2.join();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    synchronized void firstSyncMethod(String threadName) {

        System.out.format("begin firstSyncMethod() %s\n", threadName);

        for (int i = 0; i < 5; i++) {
            System.out.format("looping firstSyncMethod() %s #%s for object %s\n", threadName, i, this);
            try {
                this.wait(100);
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("end firstSyncMethod() " + threadName);
    }

    private class SyncMethodThread extends Thread {

        final private SyncMethods sm;

        public SyncMethodThread(SyncMethods sm) {
            this.sm = sm;
        }

        @Override
        public void run() {
            System.out.format("inside run() %s, sm: %s\n", this.getName(), sm);
            sm.firstSyncMethod(this.getName());
        }
    }
}

我得到这个输出:

inside syncMethodsInvoker()
inside run() Thread-0, sm: multithreading.SyncMethods@6189a0b9
inside run() Thread-1, sm: multithreading.SyncMethods@6189a0b9
begin firstSyncMethod() Thread-0
looping firstSyncMethod() Thread-0 #0 for object multithreading.SyncMethods@6189a0b9
begin firstSyncMethod() Thread-1
looping firstSyncMethod() Thread-1 #0 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-0 #1 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #1 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-0 #2 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #2 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #3 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-0 #3 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #4 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-0 #4 for object multithreading.SyncMethods@6189a0b9
end firstSyncMethod() Thread-1
end firstSyncMethod() Thread-0

由于两个线程都锁定在同一实例上,因此我期望循环进行如下操作:

looping firstSyncMethod() Thread-0 #0 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-0 #1 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-0 #2 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-0 #3 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-0 #4 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #0 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #1 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #2 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #3 for object multithreading.SyncMethods@6189a0b9
looping firstSyncMethod() Thread-1 #4 for object multithreading.SyncMethods@6189a0b9

我在这里做错了什么?

由于这一行, this.wait(100); 这会导致当前线程释放锁并等待100ms。 因此,另一个线程可以获得该锁。

Object.wait(长)

此方法使当前线程(称为T)将自己置于该对象的等待集中,然后放弃对该对象的所有同步声明 线程T出于线程调度目的而被禁用,并且处于休眠状态,直到发生以下四种情况之一:...

埃里克森(Erickson)对问题的评论来补充答案:如果要在“等待”时保留锁定,请使用Thread.sleep() (或TimeUnit.MILLIS.sleep() )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM