我正在用java做一个远程应用
没有 ds.close() 方法的 UDP 服务器线程
public class UDPThreadServer extends Thread { private DatagramSocket datagramSocket; private DatagramPacket datagramPacket; private byte[] data; // the array of bytes which will store data here public UDPThreadServer() { // initialize variables // setup something } public void run() { // overriding run method while(true) { // or while(!ds.isClosed()) datagramSocket.receive(dp); // receive data and assign to byte array } } }
主程序
public class Main { public static UDPThreadServer udpThread; // the udp server running in thread public static void main(String[] args) { udpThread = new UDPThreadServer(); udpThread.start(); // start the thread System.in.read(); } }
假设我有这个方法
public static void newThread() {
udpThread = new UDPThreadServer(); // destroy and reinitialize thread without calling udpThread.stopUDP();
}
我对 java 中的线程安全性很好奇。
调用newThread()方法安全吗???
最佳答案
这取决于您在构造函数中执行的操作。您的代码不会启动新线程。
如果代码被多个线程同时调用是安全的,那么它就是线程安全的。
局部变量
局部变量存储在每个线程自己的栈中。这意味着局部变量永远不会在线程之间共享。 因此它们始终是线程安全的。
本地对象引用
对象的局部引用有点不同。 引用本身不共享。然而,引用的对象并不存储在每个线程的本地堆栈中。
所有对象都存储在共享堆中。如果在本地创建的对象永远不会逃脱创建它的方法,那么它就是线程安全的。
这里是一个线程安全的局部对象的例子:
public void someMethod(){
LocalObject localObject = new LocalObject();
localObject.callMethod();
method2(localObject);
}
public void method2(LocalObject localObject){
localObject.setValue("value");
}
对象成员(字段)
对象成员(成员变量)与对象一起存储在堆上。 因此,如果两个线程在同一个对象实例上调用一个方法并且该方法更新对象成员,则该方法不是线程安全的。
使用以下任何条件可以使字段安全
- 让它变得不稳定
- 将其设为最终(并在构造函数完成后访问)。 more here
- 现场访问受锁保护。 (使用同步或显式锁)
- 使用不变性
关于java - 销毁正在运行的线程并在新变量中重新初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9408016/