现在了解了java多县城的内存模型,也知道了volatile关键字的作用,但是我现在需要一个程序证实volatile的作用,写了几个程序,无论怎么跑,有没有关键字volatile不影响程序的结果,
不知道哪位大虾能不能提供一个这样的程序:
    使用volatile关键字,则程序输出预期的结果,否则输出错误的结果。
    
问题解决后立即给分!
多谢!!!!

解决方案 »

  1.   

    public class A implements java.io.Serializable {
    public volatile int i=0;
    public int j=1;
    }
    然后把这个类写进一个文件看看
      

  2.   

    这个修饰符应该表示变量是线程安全的吧
    你写两个或多个线程,并发访问同一个volatile的变量i
    例如在run里面:
    if(i>0)
    {
      Thread,.sleep(10);
      System.out.println(i--);
    }
    如果某个线程的输出为0甚至是负数,则说明你的程序不是线程安全的
     但是加了volatile修饰应该就不会有这种情况发生
      

  3.   

    // 可以试试这个程序,测试volatile的atomic机制,uncomment volatile时结果正常.
    // 期待更好的测试
    class VolatileTester extends Thread {
      static int count = 10000000;
      long key;//  volatile
      static long val;  public VolatileTester(int k) {
        key = ((long)k << 32) | k; // k * 2^32 + k
        val = key;
        System.out.println("Input="+k + " key="+Long.toHexString(key));
       }   public void check(long temp) {
         long upper32 = temp >>> 32;
         long lower32 = 0xffffffffL & temp;     if (upper32 != lower32) {
            System.out.println("key=" + Long.toHexString(key)
                               + " val=" + Long.toHexString(temp)
                               + " upper=" + Long.toHexString(upper32)
                               + " lower=" + Long.toHexString(lower32));
            System.exit(1);
          }
        }    public void run() {
          for (int i = 0; i < count; i++) {
            check(val);
            val = key;
          }
        }    public static void main(String args[]) {
          int threads = 10;
          for (int t = 1; t < threads; t++)
            new VolatileTester(t).start();
        }
      }
      

  4.   

    volatile的效果是不会每次都有体现的,因为结果本来就是有偶然性的,所有可能执行10000次才会有一次出现不同
      

  5.   

    我的理解是:
      有了volatile,则编译器需要保证每次用该变量时都要保证与主备份相同,对该变量的修改也保证是atomic的.
      没有volatile,则编译器就会对该变量进行"优化",怎么快,怎么省事怎么来,对它的操作并不保证atomic.
      

  6.   

    >volatile的效果是不会每次都有体现的,因为结果本来就是有偶然性的,所有可能执行10000次才会有一次出现不同正因为这样,所以才需要一个合适的程序来"催化"这种偶然性出现