Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的多线程可以访问哪些变量?_Java_Multithreading - Fatal编程技术网

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
或诸如此类)。