【发布时间】:2015-09-15 22:01:32
【问题描述】:
MutableInteger 不被视为线程安全类,因为它在从不同线程调用时可能经常返回陈旧值。
class MutableInteger{
private int value;
public int get(){
return value;
}
public void set(int value){
this.value=value;
}
}
这是我的线程实现:- 有一个主线程(main 方法)并从中调用 MyThread。
class MyThread extends Thread{
private int num;
public void set(int num){
this.num=num;
}
public void run(){
MutableInteger mi=new MutableInteger();
mi.set(num);
System.out.println("Mythread "+mi.get());
}
}
class MutableIntegerTest{
public static void main(String[] args){
MyThread t1=new MyThread();
t1.set(10);
t1.start();
MutableInteger mi=new MutableInteger();
mi.set(99);
System.out.println("Main thread" +mi.get());
}
}
现在这是我无法理解的。要访问状态变量value,我们需要使用MutableInteger 类的getter 和setter 方法,因此对于每次访问,我们都需要实例化MutableInteger 类。现在根据理论,每个对象都有自己的实例变量副本。在我的实现中,两个线程仅通过MutableInteger 实例访问value 变量。在我的情况下,value 不会在线程之间共享,从而使我的 MutableInteger 线程安全。
我应该怎么做才能让线程共享value?我是否应该公开该对象以便我可以在两个线程中使用相同的对象?但这不会将对象公开给所有可用的类和线程吗?
我做错了吗?
【问题讨论】:
-
你有什么问题?除了
MyThread.num之外没有共享数据,并且只有在线程尚未启动时才会设置。或者更确切地说:你想实现什么? -
考虑 AtomicInteger。
-
那么我应该如何从多个线程访问同一个实例。我应该公开实例还是应该将实例从 1 个线程传递给另一个线程??
-
鉴于 MutableInteger 类,我只是想知道如何为其编写线程类。
-
..._我只是想知道如何为它写一个线程类_。这意味着什么? “它的线程类”会做什么?
标签: java multithreading