看了http://www.ibm.com/developerworks/java/library/j-praxis/pr50.html这篇文章。
它的意思就是:两个线程操作同一对象的字段的时候,每个线程会创建一个该字段的copy,当一个线程更新该字段以后,另一个线程读取该值的时候,有可能取出的还是老值。但我自己反复测试,都没有出现过这种情况,有点怀疑!请大家讨论一下。

解决方案 »

  1.   

    synchronized应用最为经典的还是售票系统
    建议你去看看如何用多线程处理售票的,你就知道synchronized的用处了.
      

  2.   

    两个线程操作同一对象的字段的时候,每个线程会创建一个该字段的copy,当一个线程更新该字段以后,另一个线程读取该值的时候,有可能取出的还是老值
    =========================================================================================================================
    JVM规范中说的类似,某个线程改变了他所拥有的拷贝的变量值后,会刷新到主存储区域中,至于什么时候刷由JVM控制,在这个刷新的过程中可能会有数据被改变等并发的问题,不过这和你提供链接中的文章中的例子不是一回事。
    不过这段话和synchronized没有什么直接的关系,synchronized是控制线程对对象的访问,为他所保护的对象维护一个锁
    volatile是指线程访问一个变量时每次都到主存储区去取最新的值
      

  3.   


    如果你不需要数据的同步方法的话,可以将字段定义为 volatile,这样的话多线程会去内存地址重新取值,而不是操作对象的拷贝
      

  4.   

    synchronized应用最为经典的还是售票系统 
    需要价格锁锁了{进来买票 A}开锁这个时候其他人进不去,只能有一个人在买A,所以A不会被卖出两次
      

  5.   

    就举个例子,2个线程都是对数据库的表中字段a更新,a原值为100,线程1的操作是a*2,线程2的操作是a-10,不加锁的话,假设线程1执行到a=a*2;但是还没有commit,此时线程2也开始执行,a=a-10;此时也就是读取了老值。可以在线程中加sleep试试看,是否正确。所以要加synchronized
      

  6.   


    这里不是锁不锁的问题,而是如何测试证明“每个线程会创建一个该字段的copy”!
      

  7.   


    说的不是数据库,而是java语言。对象在内存中存取的时候,是不是有个所谓的线程拷贝??如果有的话,那单线程是不是也有个拷贝
      

  8.   

    关于原子性的具体例子可以参考:http://cuizhenfu.javaeye.com/blog/103240
      

  9.   

    synchronized应用最为经典的还是售票系统 
    建议你去看看如何用多线程处理售票的,你就知道synchronized的用处了.
      

  10.   

    其实对Java中的原子性数据是不存在LZ的问题的,基本类型数据一般都是原子性。但是对于long 和 double 除外,也是根据Java的运行环境决定的。如果要在线程之间共享long、double等字段,必须使用锁;如果对多线程没什么要求的话,和前面说的一样,可以使用volatilevolatile: 1、内存同步
               2、以atomic的方式进行long、double的指定详细可以自己去看看Java内存模型
      

  11.   

    在多线程情况下,因为你无法知道线程会在什么时候执行,加synchronized是告诉线程,这里我已经占有了,你要用,需要等我执行完了。另一个线程就只要等待。
      

  12.   

    synchronized的前提必须是同一个实现中才以可以起作用。
    lz是不是两个实现一起弄,所以看不出效果。