Выполнение синхронизированного и несинхронизированного метода в одном классе - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть два метода в классе, один из которых синхронизирован, а другой не синхронизирован.Когда я вызываю эти методы из двух разных потоков, я вижу, что выполнение становится последовательным, а не параллельным.

Я в замешательстве, согласно теории r.processSomething () не должно ждать r.doSomething () для завершения его выполнения.

Если у кого-то есть идеи по поводу выполнения двух методов (синхронизированных и несинхронизированных) одновременно.Пожалуйста, поделитесь.

class LockObjectDemo{

    public static void main(String[] args){

        SharedResource r = new SharedResource();

        MyThread t1 = new MyThread(r);
        t1.start();

        MyThread t2 = new MyThread(r);
        t2.start();

    }
}


class MyThread extends Thread{
    private SharedResource r ;

    MyThread(SharedResource r){
        this.r = r;
    }

    public void run() {     
        try {
            r.doSomething(); // Only after completing this method , the other thread enters into the next method which is not locked
            r.processSomething();           
        } catch(Exception ex){
            System.out.println(ex);
        }

    }
}

class SharedResource{

    public void doSomething() throws Exception{
        synchronized(this){ 
            System.out.println("Doing Something -> "+Thread.currentThread().getName());
            Thread.sleep(5000);
            System.out.println("Done Something->"+Thread.currentThread().getName());
        }
    }

    public void processSomething() throws Exception{
        System.out.println("Processing Something -> "+Thread.currentThread().getName());
        Thread.sleep(1000);
        System.out.println("Done Processing->"+Thread.currentThread().getName());
    }
}

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

У вас есть 2 вещи, по ~ 5 с, выполняющиеся последовательно (из-за synchronized).

Когда первый поток завершает это действие 5 с, он начинает что-то, принимая ~ 1 с, и в то же время,второй поток запускает действие 5 с.

Первый поток завершает действие 1 с, прежде чем второй поток завершает действие 5 с.Затем второй поток выполняет действие 1 с.

Таким образом, действия 1 с не выполняются одновременно.

Графически:

Thread 1:  |<----- 5s ----->|<- 1s ->|
Thread 2:                   |<----- 5s ----->|<- 1s ->|
0 голосов
/ 17 апреля 2019

Дальнейший анализ вышеприведенного решения предоставлен "@Andy Turner".

В этой задаче мы должны учитывать следующие две вещи.

1) Оба MyThread - t1 и t2поделитесь тем же SharedResource r.Это ограничит выполнение «doSomething», поэтому выполнение будет происходить в последовательном порядке.В зависимости от того, какой поток выбран первым, другой должен дождаться успешного завершения первого потока.т.е. спать в течение 5 сек.

Для этой задачи предположим, что

a) Поток t1 запущен первым, т.е. t1.doSomething ()

b) Ни один из других потоков, т. Е. T1 и t2, не может выполнить любойдругие методы из-за того, что t2 зависит от блокировки синхронизации, а t1 ожидает завершения первого метода doSomething, прежде чем он сможет запустить processSomething.

2) Как только первый поток (t1) "doSomething "выполнен успешно, оба потока находятся в состоянии выполнить одновременно.

Здесь потоки будут выполняться, как прокомментировано "@Andy Turner" выше.

...