Синхронизация, джава

254
27 апреля 2018, 15:46

Есть следующий вопрос: нужна ли синхронизация ресурса,используемых разными потоками, если происходит только чтение ресурса, сам ресурс никак не изменяется. Вот написал на коленке небольшой пример.

public class Test {
static Thread t1;
static Thread t2;
static Thread t3;
public static void main(String[] args) {
    t1 = new Thread(new MyThread1());
    t2 = new Thread(new MyThread2());
    t3 = new Thread(new MyThread3());
    t1.start();
    t2.start();
    t3.start();
}
static class MyThread1 implements Runnable{
    @Override
    public void run(){
        while(true) {
            Thread.State state = t3.getState();
            boolean isAlive = t3.isAlive();
            //исключаем призрачную возможность того, что вывод будет неправильным
            synchronized (System.out){
                System.out.println(Thread.currentThread().getId() + " - " + state);
            }
            if(!isAlive)
                return;
        }
    }
}
static class MyThread2 implements Runnable {
    @Override
    public void run(){
        while(true) {
            Thread.State state = t3.getState();
            boolean isAlive = t3.isAlive();
            //исключаем призрачную возможность того, что вывод будет неправильным
            synchronized (System.out){
                System.out.println(Thread.currentThread().getId() + " - " + state);
            }
            if(!isAlive)
                return;
        }
    }
}
static class MyThread3 implements Runnable {
    @Override
    public void run(){
        int count = 0;
        while(true){
            try{
                Thread.currentThread().sleep(200);
                if(count > 15)
                    break;
                count++;
            }
            catch (InterruptedException e){
            }
        }
    }
}

}

В данном коде общим ресурсом является

static Thread t3;

В потоках t1 и t2 мы проверяем состояние потока t3

Thread.State state = t3.getState();
boolean isAlive = t3.isAlive();

Может ли тут пойти что-то не так. Допустим 2 потока t1 и t2 попробуют одновременно получить доступ к методу getState(). Если тут все-таки нужна синхронизация, то объясните почему так и что конкретно может пойти не так.

Answer 1

Thread.isAlive() можно спокойно вызывать без синхронизации. А вот Thread.getState() не обеспечивает соблюдения happens before, поэтому потоки t1 и t2 без использования синхронизации могут не заметить изменения состояния потока t3.

READ ALSO
NumberFormatException Java

NumberFormatException Java

Нужно сделать класс, который спрашивает у пользователя целое число, умножает его на 2 и выводит этоПреобразовать полученный от пользователя...

223
Не запускается jar файл JavaFX проекта intelliJIDEA

Не запускается jar файл JavaFX проекта intelliJIDEA

Сделал готовый javaFX проект intellijIDEAЗашел ProjectStructure -> Artifacts -> Add jar

255
Как подключать кнопки в BottomNavigationView?

Как подключать кнопки в BottomNavigationView?

Не понятно как это происходит именно в BottomNavigationViewХотелось бы узнать у более опытных

245
Сертификаты java от oracle

Сертификаты java от oracle

На сколько мне известно что большинства сертификатов не имеют никакого смыслаНо в то же время слышал что некий вес имеют сертификаты от oracle,...

255