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)