-1

我有这个代码:

public class Tarea implements Runnable
{

    private int valor;


    public Tarea()
    {
         valor = 0;
    }


    public void run()
    {
         for (int i = 1; i <= 10; i++)
         {
             valor++;
         }
         System.out.println(Thread.currentThread().getName() + " Valor " + valor);
    }
}

public class AppTarea
{

    public static void main(String[] args)
    {
         Thread[] hilos = new Thread[5];
         for (int i = 0; i < hilos.length; i++)
         {
             hilos[i] = new Thread(new Tarea());
             hilos[i].start();
         }
         System.out.println("Main terminado");
    }
}

这个线程安全吗?我应该将变量 valor 定义为 volatile。valor 是否在不同的线程中共享?谢谢。

4

6 回答 6

1

它是线程安全的,因为没有共享任何东西......该变量valor对于每个线程都是唯一的......

于 2012-05-25T07:14:54.423 回答
0

答案是肯定的。每个线程都在自己的上下文中运行并使用变量“valor”。

于 2012-05-25T07:31:53.637 回答
0

简短的回答:是的,这是线程安全的。

长答案:您的代码是线程安全的,因为您的线程的成员变量都不是共享资源。这意味着您创建的每个线程都拥有一个valor成员变量。volatile应该用于共享资源,以确保它们是同步的,而不是在线程之间缓存。

于 2012-05-25T07:24:12.553 回答
0

这是线程安全的,因为它只能run()从同一个类访问构造函数和方法。唯一可以使用该变量的线程是正在运行的线程,它在java 内存模型(实际上是我知道的任何内存模型)下与自身同步,因此这里没有数据竞争。这里不需要volatile也不需要synchronized关键字。

当你想从多个线程修改一个变量,并且你不希望它被存储在缓存中时,使用 volatile 关键字。情况并非如此 - 变量在此处由单个线程修改。

于 2012-05-25T07:15:00.883 回答
0

您的变量是一个实例变量,线程和实例之间存在一对一的映射。所以每个线程都有一个单独的状态副本。因此不需要同步。

如果变量在线程之间共享,那么您将需要同步。

于 2012-05-25T07:16:28.857 回答
-1

不,它不是共享的,它是一个私有实例变量。该类的每个实例都有一个私有副本,并且无法在类外部访问它,因此它是安全的。

--根据下面的讨论,我最初的答案是错误的-错过了关键实例与静态变量角度。以下是原答案:

不,它不是共享的,它是私有变量。没有办法在课堂外访问它,所以它是安全的。

于 2012-05-25T07:13:38.570 回答