加synchronized关键字之后,执行结果还是不确定

来源:3-3 synchronized实现可见性代码(中)

Caption_1210

2017-05-28 20:26

package jmm;

/**
 * Created by WangLong on 2017-05-28.
 */
public class SynchronizedDemo {
    //共享变量
    private boolean ready=false;
    private int result=0;
    private int number=1;

    /**
     * 写操作
     */
    public synchronized void write(){
        ready=true;
        number=2;
    }

    /**
     * 读操作
     */
    public synchronized void read(){
        if(ready){
            result=number*3;
        }
        System.out.println("result的值为:"+result);
    }

    /**
     * 内部线程类
     */
    private class ReadWriteThread extends Thread{
        private boolean flag;
        public ReadWriteThread(boolean flag){
            this.flag=flag;
        }

        public void run(){
            if(flag){
                write();    //构造方法中传入true,执行写操作
            }else{
                read();     //构造方法中传入false,执行读操作
            }
        }
    }

    public static void main(String[] args) {
        SynchronizedDemo demo=new SynchronizedDemo();
        demo.new ReadWriteThread(true).start();     //启动线程执行写操作
        /*try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/
        demo.new ReadWriteThread(false).start();     //启动线程执行读操作
    }
}

/**

    代码如上:仅仅加入synchronized关键字之后,执行结果还是不确定啊?

*/

写回答 关注

2回答

  • 小烧饼
    2017-06-13 09:07:30

    调用的时候用线程调用,否则和普通方法调用一样

  • tanyaping2015
    2017-05-29 08:55:31

    应该加上synchronized(this),而不是为方法加synchronized

    Captio...

    是由于实例变量导致的非线程安全问题,解决方法可以在run方法前面加synchronized 关键字(synchronized 可以在任意对象及方法上面加锁): synchronized public void run() { if (flag) { write(); //构造方法中传入true,执行写操作 } else { read(); //构造方法中传入false,执行读操作 } }

    2017-05-29 13:21:51

    共 1 条回复 >

细说Java多线程之内存可见性

用两种方式实现内存可见性,代领大家深层次学习Java中的内存

55899 学习 · 88 问题

查看课程

相似问题