Java 是否可以在几个线程之间共享一个变量,但不能在所有线程之间共享?

Java 是否可以在几个线程之间共享一个变量,但不能在所有线程之间共享?,java,spring,multithreading,thread-safety,Java,Spring,Multithreading,Thread Safety,我正在从第三方API获取数据,我想知道是否可以在一些线程之间共享变量,但不是所有线程 例如: 我有2个用户,我为每个用户启动2个线程。假设线程A、B用于用户1,线程C、D用于用户2。现在,我需要某种类型的标志来通知线程何时停止(让我们假设已经读取的页面总数,这因用户而异)。问题是,必须为属于此特定用户的2个线程同步该标志,但不能同步其他线程。我无法修改用户实体。创建两个标志是不可选择的,因为这只是一个示例,实际上可能有多个用户提取他们的数据 这可能吗?如果是的话,怎么办 谢谢您的时间。只需使用布

我正在从第三方API获取数据,我想知道是否可以在一些线程之间共享变量,但不是所有线程

例如:

我有2个用户,我为每个用户启动2个线程。假设线程A、B用于用户1,线程C、D用于用户2。现在,我需要某种类型的标志来通知线程何时停止(让我们假设已经读取的页面总数,这因用户而异)。问题是,必须为属于此特定用户的2个线程同步该标志,但不能同步其他线程。我无法修改用户实体。创建两个标志是不可选择的,因为这只是一个示例,实际上可能有多个用户提取他们的数据

这可能吗?如果是的话,怎么办


谢谢您的时间。

只需使用布尔标志创建和对象,并将其传递给构造函数中同一用户的两个线程,然后将其存储在字段中

只需使用布尔标志创建和对象,并将其传递给构造函数中同一用户的两个线程,然后在为用户,还可以创建需要共享的标志并将其传递给线程,以便他们可以使用它并共享信息

比如:

AtomicBoolean userFlag = new AtomicBoolean(false);
Runnable a = new UserRunnable(userFlag);
Runnable b = new UserRunnable(userFlag);
// run a and b
UserRunnable

public class UserRunnable implements Runnable {
    private final AtomicBoolean flag;
    // + constructor

    @Override
    public void run() {
        // use the flag
    }
}
在为用户创建线程时,还要创建需要共享的标志并将其传递给线程,以便他们可以使用它并共享信息

比如:

AtomicBoolean userFlag = new AtomicBoolean(false);
Runnable a = new UserRunnable(userFlag);
Runnable b = new UserRunnable(userFlag);
// run a and b
UserRunnable

public class UserRunnable implements Runnable {
    private final AtomicBoolean flag;
    // + constructor

    @Override
    public void run() {
        // use the flag
    }
}
是否可以在几个线程之间共享一个变量,但不能在所有线程之间共享

这取决于你所说的“分享”是什么意思。程序中的所有线程都在同一虚拟地址空间中运行。内存中的任何对象都可能被任何线程访问,但这并不意味着每个线程都必须访问每个对象

线程执行您为其编写的代码告诉它们执行的任何操作。如果希望两个不同的线程查看两个不同的标志,那么为它们编写代码,查看两个不同的标志。或者,编写一个类,在其构造函数中接受一个
标志
对象,然后对两个线程使用同一个类,但使用引用不同
标志
对象构造的不同实例

是否可以在几个线程之间共享一个变量,但不能在所有线程之间共享

这取决于你所说的“分享”是什么意思。程序中的所有线程都在同一虚拟地址空间中运行。内存中的任何对象都可能被任何线程访问,但这并不意味着每个线程都必须访问每个对象


线程执行您为其编写的代码告诉它们执行的任何操作。如果希望两个不同的线程查看两个不同的标志,那么为它们编写代码,查看两个不同的标志。或者,编写一个类,在其构造函数中接受一个
标志
对象,然后对两个线程使用同一个类,但使用引用不同
标志
对象构造的不同实例。

如果我创建一个包含2个整数的对象,并使用线程内的同步{}块访问它们,我想它也会起作用(在运行方法中)?它将仅在包含对对象的此特定引用的线程之间进行同步。是否正确?如果我创建一个包含2个整数的对象,并在线程内使用同步{}块访问它们,它也会起作用(在运行方法中)?它将只在包含对对象的特定引用的线程之间进行同步。对吗?是的,我对多线程有点陌生,不知怎的,我认为如果我在线程中声明一个对象,那么它将与所有线程同步,而不管是哪个实例。现在我想知道为什么我会这样想。有用的信息tho.谢谢你的输入。是的,我对多线程有点陌生,我不知怎么想,如果我在线程中声明一个对象,那么它就会与所有线程同步,不管是哪个实例。现在我想知道为什么我会这样想。有用的信息tho。谢谢你的输入。