class ViolentAccessDemo
{
    public static void main(String args[]) throws InterruptedException
    {
        ViolentObject violentObject = new ViolentObject();
        Thread thread1 = new Thread(new ThreadAccess(violentObject));
        Thread thread2 = new Thread(new ThreadAccess(violentObject));
   //     thread2.setPriority(Thread.MAX_PRIORITY);
        thread1.start();
        thread2.start();
        for(int i=0;i<100;i++)
        {
            violentObject.print();     
            Thread.sleep(500);            
        }
        
    }
}
class ViolentObject
{
     volatile long x;  //这里加不加volatile我觉得没什么区别,有高手说加了x与y之间差别在4之内,但实际不是
     volatile long y;   //这是为什么??
    public void increase()
    {
        x++;      
        y++;       
    }
    public void print()
    {
        System.out.println("x="+x+", "+"y="+y);
        if(x<y)
        System.out.println("x<y");
    }
}
class ThreadAccess implements Runnable
{
    private ViolentObject violentObject;
    public ThreadAccess(ViolentObject vob)
    {
        System.out.println("this is constructor of ThreadAccess");
        this.violentObject = vob;
    }
    public void run()
    {
        while(true)
        {
          violentObject.increase();        }
          
    }
}

解决方案 »

  1.   

    首先感谢楼主.. 我以前都不知道有这个关键之.. volatile不过还是挺容易理解的.  主要还是为了变量上的同步. 当有两个或两个以上方法访问这个变量的时候..保持同步..这样写让变量不能创建私有的拷贝.  防止jvm优化代码.  当然  什么都是两面性的. 用这个 . 就会使效率大大降低..跟synchronized一个毛病..
         你也可以把那个x y 写道synchronized里面..跟这个一个效果.
      

  2.   

    volatile 禁止编译器对变量进行优化
    就是说每次都是从内存中取变量值,而不把变量放到缓存中
      

  3.   

    可以说是成都较轻的synchronized。
    synchronized可以修饰方法,对象。
    而volatile可以修饰变量,包括基本类型的变量。
      

  4.   

    看这个吧 http://www.ibm.com/developerworks/cn/java/j-jtp06197.html