至少在这段代码里是多余的,因为isOnChanged 在get方法里永远不会是true

解决方案 »

  1.   


    我是这样想的,在多线程当中使用单例模式,如果别的线程中的get与set产生了竞争条件,有没有可能正好是取数据的时候为正在修改的时候,或者高手给指点下,代码该如何修改。
      

  2.   


    我是这样想的,在多线程当中使用单例模式,如果别的线程中的get与set产生了竞争条件,有没有可能正好是取数据的时候为正在修改的时候,或者高手给指点下,代码该如何修改。get和set都在spoutNowSum 上加了锁,这里是同步操作,消除了竞争条件,一次性只有一个线程在get或set,所以不存在数据没修改完就有线程来取
      

  3.   


    我是这样想的,在多线程当中使用单例模式,如果别的线程中的get与set产生了竞争条件,有没有可能正好是取数据的时候为正在修改的时候,或者高手给指点下,代码该如何修改。get和set都在spoutNowSum 上加了锁,这里是同步操作,消除了竞争条件,一次性只有一个线程在get或set,所以不存在数据没修改完就有线程来取
    额这个倒是,如果set的同时,又get了,又没有wait,那么线程会不会发生阻塞呢?该如何解决?
      

  4.   

    spoutNowSum  这个用atom类型就可以...  不用 synchronized
      

  5.   


    我是这样想的,在多线程当中使用单例模式,如果别的线程中的get与set产生了竞争条件,有没有可能正好是取数据的时候为正在修改的时候,或者高手给指点下,代码该如何修改。get和set都在spoutNowSum 上加了锁,这里是同步操作,消除了竞争条件,一次性只有一个线程在get或set,所以不存在数据没修改完就有线程来取
    额这个倒是,如果set的同时,又get了,又没有wait,那么线程会不会发生阻塞呢?该如何解决?

    get的时候isOnChanged不可能为true,那个wait的方法不会被执行到的,单纯要保证getset的安全,不用这个复杂,直接在方法上加synchronized就好了,其他的代码都可以去掉
      

  6.   


    我是这样想的,在多线程当中使用单例模式,如果别的线程中的get与set产生了竞争条件,有没有可能正好是取数据的时候为正在修改的时候,或者高手给指点下,代码该如何修改。get和set都在spoutNowSum 上加了锁,这里是同步操作,消除了竞争条件,一次性只有一个线程在get或set,所以不存在数据没修改完就有线程来取
    额这个倒是,如果set的同时,又get了,又没有wait,那么线程会不会发生阻塞呢?该如何解决?

    get的时候isOnChanged不可能为true,那个wait的方法不会被执行到的,单纯要保证getset的安全,不用这个复杂,直接在方法上加synchronized就好了,其他的代码都可以去掉受教了仿佛明白了什么。但是如果遇到阻塞的时候会怎样,
      

  7.   


    我是这样想的,在多线程当中使用单例模式,如果别的线程中的get与set产生了竞争条件,有没有可能正好是取数据的时候为正在修改的时候,或者高手给指点下,代码该如何修改。get和set都在spoutNowSum 上加了锁,这里是同步操作,消除了竞争条件,一次性只有一个线程在get或set,所以不存在数据没修改完就有线程来取
    额这个倒是,如果set的同时,又get了,又没有wait,那么线程会不会发生阻塞呢?该如何解决?

    get的时候isOnChanged不可能为true,那个wait的方法不会被执行到的,单纯要保证getset的安全,不用这个复杂,直接在方法上加synchronized就好了,其他的代码都可以去掉受教了仿佛明白了什么。但是如果遇到阻塞的时候会怎样,遇到阻塞时不怎么样,效率和安全是一对矛盾体,你要保证效率就要并行,要并行就必然有安全问题;你要安全就要串行,所有逻辑全部串行就绝对安全但是牺牲效率。所以在某些场景下,牺牲效率是没有办法的。不过好在对于一般的系统而言,性能瓶颈都不会出现在这种阻塞/不阻塞的权衡上,建议你也不要在这种问题上纠结,没有意义
      

  8.   


    我是这样想的,在多线程当中使用单例模式,如果别的线程中的get与set产生了竞争条件,有没有可能正好是取数据的时候为正在修改的时候,或者高手给指点下,代码该如何修改。get和set都在spoutNowSum 上加了锁,这里是同步操作,消除了竞争条件,一次性只有一个线程在get或set,所以不存在数据没修改完就有线程来取
    额这个倒是,如果set的同时,又get了,又没有wait,那么线程会不会发生阻塞呢?该如何解决?

    get的时候isOnChanged不可能为true,那个wait的方法不会被执行到的,单纯要保证getset的安全,不用这个复杂,直接在方法上加synchronized就好了,其他的代码都可以去掉受教了仿佛明白了什么。但是如果遇到阻塞的时候会怎样,遇到阻塞时不怎么样,效率和安全是一对矛盾体,你要保证效率就要并行,要并行就必然有安全问题;你要安全就要串行,所有逻辑全部串行就绝对安全但是牺牲效率。所以在某些场景下,牺牲效率是没有办法的。不过好在对于一般的系统而言,性能瓶颈都不会出现在这种阻塞/不阻塞的权衡上,建议你也不要在这种问题上纠结,没有意义
    大师受教了给点学习方法和参考书籍
      

  9.   


    我是这样想的,在多线程当中使用单例模式,如果别的线程中的get与set产生了竞争条件,有没有可能正好是取数据的时候为正在修改的时候,或者高手给指点下,代码该如何修改。get和set都在spoutNowSum 上加了锁,这里是同步操作,消除了竞争条件,一次性只有一个线程在get或set,所以不存在数据没修改完就有线程来取
    额这个倒是,如果set的同时,又get了,又没有wait,那么线程会不会发生阻塞呢?该如何解决?

    get的时候isOnChanged不可能为true,那个wait的方法不会被执行到的,单纯要保证getset的安全,不用这个复杂,直接在方法上加synchronized就好了,其他的代码都可以去掉受教了仿佛明白了什么。但是如果遇到阻塞的时候会怎样,遇到阻塞时不怎么样,效率和安全是一对矛盾体,你要保证效率就要并行,要并行就必然有安全问题;你要安全就要串行,所有逻辑全部串行就绝对安全但是牺牲效率。所以在某些场景下,牺牲效率是没有办法的。不过好在对于一般的系统而言,性能瓶颈都不会出现在这种阻塞/不阻塞的权衡上,建议你也不要在这种问题上纠结,没有意义
    大师受教了给点学习方法和参考书籍性能与安全这一块还是经验相关,接触得多了慢慢就比较熟悉了