为了账号安全,请及时绑定邮箱和手机立即绑定

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

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 回答

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

0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~
#1

Caption_1210 提问者

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

举报

0/150
提交
取消

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

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号