java中的多线程可以访问哪些变量?
我正在处理一个简单的消息队列,为新连接创建单独的线程。我想知道哪些变量是可访问的,并且可以由多个线程修改java中的多线程可以访问哪些变量?,java,multithreading,Java,Multithreading,我正在处理一个简单的消息队列,为新连接创建单独的线程。我想知道哪些变量是可访问的,并且可以由多个线程修改 class RequestHandler implements Runnable { Socket socket; protected RequestHandler(Socket socket) { this.socket = socket; } public void run() { .......... 在上面的代码中,套接字可以被
class RequestHandler implements Runnable {
Socket socket;
protected RequestHandler(Socket socket) {
this.socket = socket;
}
public void run() { ..........
在上面的代码中,套接字可以被多个线程访问,如果是,那么我如何保护它
完整代码可在以下网址获得:
我是新的多线程,请修改问题,如果需要 这篇文章中没有显示:实际上,您为每个线程创建了一个新的RequestHandler和套接字,因此由于套接字不是静态的,所以您就可以了。每个线程处理自己的连接(由套接字表示)。如果多个线程可以访问套接字变量,则需要同步访问该变量 其中一种方法是创建一个包装器,它基本上将同步方法调用[1] 然后将套接字包装到构造函数中:
class RequestHandler implements Runnable {
Socket socket;
protected RequestHandler(Socket socket) {
this.socket = new SynchronizedSocket(socket);
}
public void run() { ..........
[1] -任何非局部变量都可以由多个线程访问,前提是这些线程引用了它所属的实例(或者可以静态访问该成员)。这似乎不是一个好主意。为什么不为每个插座设置一个单独的线程@AndyTurner的评论在技术上是正确的,因为任何数量的线程都可以访问它们引用的任何字段,但为了确保这些字段的更新正确可见,您必须考虑线程同步(
final
不可变或同步
或volatile
或诸如此类)。