Различный между MutableInteger и SynchronizedInteger? - PullRequest
0 голосов
/ 08 апреля 2019

Я написал тестовый пример и надеялся, что вывод будет другим после добавления синхронизированного ключевого слова.Однако выход токового выхода не отражает роль синхронизированного.Я не знаю, что пошло не так?

Глава 3 《Параллельность Java на практике》 3.1.1

//MutableInteger (Chapter3 《Java Concurrentcy in Practice》)

@NotThreadSafe
public class MutableInteger{
    private int value;
    public       int getValue() {
        return value;
    }
    public       void setValue(int value) {
        this.value = value;
    }

    public static void main(String[] args){
        MutableInteger getAndset = new MutableInteger();
        Thread setValue8 = new Thread(){
            @Override
            public void run() {
                System.out.println("8:  start set 8");
                getAndset.setValue(8);
                System.out.println("8:   set 8 over and start get value ");
                System.out.println( getAndset.getValue());
                System.out.println("8:   get value over");
            }
        };

        Thread setValue10 = new Thread(){
            @Override
            public void run() {
                System.out.println("10:  start set 10");
                getAndset.setValue(10);
                System.out.println("10:  set 10 over");
            }

        };

        setValue8.start();
        setValue10.start();
    }


}

Возможный вывод: output1:

8: start set 8 10: start set 10 8: set 8 over and start get value 10: set 10 over 10 8: get value over

output2:

10: start set 10 8: start set 8 10: set 10 over 8: set 8 over and start get value 8 8: get value over

output3:

8: start set 8 8: set 8 over and start get value 8 8: get value over 10: start set 10 10: set 10 over

Класс SynchronizedInteger добавить синхронизированный


import net.jcip.annotations.GuardedBy;
import net.jcip.annotations.ThreadSafe;

@ThreadSafe
public class SynchronizedInteger {
    @GuardedBy("this") private int value;
    public   synchronized    int getValue() {
        return value;
    }
    public   synchronized    void setValue(int value) {
        this.value = value;
    }

    public static void main(String[] args){
        SynchronizedInteger getAndset = new SynchronizedInteger();
        Thread setValue8 = new Thread(){
            @Override
            public void run() {
                System.out.println("8:  start set 8");
                getAndset.setValue(8);
                System.out.println("8:   set 8 over and start get value ");
                System.out.println( getAndset.getValue());
                System.out.println("8:   get value over");
            }
        };

        Thread setValue10 = new Thread(){
            @Override
            public void run() {
                System.out.println("10:  start set 10");
                getAndset.setValue(10);
                System.out.println("10:  set 10 over");
            }

        };

        setValue8.start();
        setValue10.start();
    }

}

Возможный вывод: output1:

8: start set 8 8: set 8 over and start get value 8 8: get value over 10: start set 10 10: set 10 over

output2:

8: start set 8 8: set 8 over and start get value 8 8: get value over 10: start set 10 10: set 10 over

output3:

8: start set 8 10: start set 10 8: set 8 over and start get value 10: set 10 over 10 8: get value over

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