java中的volatile关键字对其他线程不可见,下面是我的代码

java中的volatile关键字对其他线程不可见,下面是我的代码,java,multithreading,Java,Multithreading,当我在线程T1中更新I的值时,该值对线程T2不可见-为什么?理论上,volatile变量必须检索新值,但它不起作用 class Threads implements Runnable { public volatile int i=4; volatile int j=0; int x=0; public static void main(String[] args) { Threads th=new Thread

当我在线程
T1
中更新
I
的值时,该值对线程
T2
不可见-为什么?理论上,
volatile
变量必须检索新值,但它不起作用

    class Threads implements Runnable
    {

      public volatile int i=4;
      volatile int j=0;
      int x=0;

      public static void main(String[] args) {
        Threads th=new Threads();
        Thread a = new Thread(th);
        Thread b=new Thread(th);
        a.setName("T1");
        a.setPriority(Thread.MAX_PRIORITY);
        b.setName("T2");
        a.start();
        b.start();
      }

      public int count() {
        return ++i;
      }

      public void run() {
        while(j<=10)
        {

          if(Thread.currentThread().getName().equals("T1"))
          {
            i++;
            System.out.println(Thread.currentThread().getName()+" : "+i);

           try
           {
             Thread.sleep(2);
           }catch(Exception ex){}
         }
         else if(Thread.currentThread().getName().equals("T2"))
         {

           System.out.println(Thread.currentThread().getName()+" : "+i);
           try
           {
             Thread.sleep(1);
           }catch(Exception ex){}
         }

         j++;
       }
      }
    }
类线程实现可运行
{
公共不稳定指数i=4;
挥发性int j=0;
int x=0;
公共静态void main(字符串[]args){
Threads th=新线程();
螺纹a=新螺纹(th);
螺纹b=新螺纹(th);
a、 集合名(“T1”);
a、 设置优先级(线程最大优先级);
b、 设置名称(“T2”);
a、 start();
b、 start();
}
公共整数计数(){
return++i;
}
公开募捐{

虽然(j我不知道您希望代码输出什么,但是:

请注意,即使变量是易变的,
x++
也是
x=x+1
的快捷方式。它不是原子的,执行单独的读写操作,两个操作之间的值可能会被另一个线程更改

在您的例子中,对于变量
i
,只有一个线程正在写入变量,因此这不应该是一个问题

但是对于
j
,两个线程在同一个变量上执行
j++
。对于某些迭代,一个线程很可能在另一个线程的读写之间写入
j
。导致忽略先前的写入

要避免这种情况,您可以:

  • synchronized
    块中执行
    j++
  • 使用
    AtomicInteger
    代替
    volatile int

另一点是,对
j的测试是从每个线程实例访问本地i-每个线程对象都有自己的i、j、x实例,而不是交叉引用它们


实际上,您的线程甚至不知道还有其他线程。

@Ordous,我很困惑。示例中唯一的
I
threads
类的成员变量。该示例只创建该类的一个实例,而主线程似乎没有使用
I
@jameslarge是的,您是对的,误读代码你希望这个程序输出什么?“它不工作”意味着…什么?它们使用相同的可运行实例…?(编辑:Ninja'd)
while(j.getAndIncrement() <= 10)