首页 > 解决方案 > MutableInteger 和 SynchronizedInteger 之间的区别?

问题描述

写了测试用例,希望加上synchronized关键字后输出会不一样。但是,当前输出的输出并不能体现同步的作用。我不知道出了什么问题?

第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();
    }


}

可能的输出:输出1:

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

输出2:

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

输出3:

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();
    }

}

可能的输出:输出1:

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

输出2:

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

输出3:

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

标签: javaconcurrency

解决方案


推荐阅读