Почему этот код не является "потокобезопасным"? - PullRequest
0 голосов
/ 24 апреля 2018
class ThreadUnsafe 
{ 
    static int  val1,  val2; 
    static void Go()
    { 
        if  (val2 != 0)  System.out.println( val1 / val2); 
        val2=0; 
    } 
} 

Очевидно, что метод Go () в этом коде не считается "потокобезопасным". Почему это?

1 Ответ

0 голосов
/ 24 апреля 2018

Обычно в Java, когда ожидается, что параллелизм будет проблемой, ключевое слово synchronized будет использоваться в методах, которые изменяют или считывают внутреннее состояние объекта, или блок synchronized будет использоваться с блокировкой не Нулевой объект. И то и другое потребует создания методов доступа для установки значений val1 и val2.

Пример использования синхронизированных методов, которые изменяют (или читают) внутреннее состояние:

class ThreadSafe
{
    private static int val1;
    private static int val2;

    static synchronized void go()
    {
        if (val2 != 0)
        {
            System.out.println(val1 / val2);
        }

        val2 = 0;
    }

    static synchronized void setVal1(int newVal1)
    {
        val1 = newVal1;
    }

    static synchronized void setVal2(int newVal2)
    {
        val2 = newVal2;
    }
}

В этом случае, поскольку методы являются статическими, синхронизация будет происходить в самом классе.

Пример использования синхронизации с ненулевым объектом:

class ThreadSafe
{
    private static int val1;
    private static int val2;

    private static Object lock = new Object();

    static void go()
    {
        synchronized (lock)
        {
            if (val2 != 0)
            {
                System.out.println(val1 / val2);
            }

            val2 = 0;
        }
    }

    static void setVal1(int newVal1)
    {
        synchronized (lock)
        {
            val1 = newVal1;
        }
    }

    static synchronized void setVal2(int newVal2)
    {
        synchronized (lock)
        {
            val2 = newVal2;
        }
    }
}

См. Также Что означает «синхронизированный»?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...