我有一个执行3个线程的类,在每个线程上,我都会询问并检查全局变量。我试图单独地锁定每个变量,我不想每次更改一个变量时都阻塞整个类。我研究了一下,但我还是很困惑。在这种情况下,因为我必须从每个线程访问变量,所以我必须使方法成为静态的,所以我的问题是:每次调用getter和setter时,我都会阻塞每个变量或整个类?
public class MyClass {
private static boolean bool1= false;
private static boolean bool2= false;
public static void main(String[] args) {
//run Thread1
//run Thread2
//run thread3
}
private static Object lock1 = new Object();
private static Object lock2 = new Object();
public static boolean isBool1() {
synchronized(lock1) {
return bool1;
}
}
public static void setBool1(boolean bool) {
synchronized(lock1) {
MyClass.bool1= bool1;
}
}
public static boolean isBool2() {
synchronized(lock2) {
return bool2;
}
}
public static void setBool2(boolean bool2) {
synchronized(lock2) {
MyClass.bool2= bool2;
}
}
}
发布于 2018-09-12 04:22:03
不,你没有阻塞类,你的静态方法没有声明为synchronized,你也没有阻塞类的实例,因为你的类没有实例。
但是,为了从单独的线程调用方法,没有必要将方法声明为静态的。如果您不声明任何静态内容并在单个实例上调用这些方法,那么您的代码将以相同的方式工作。这也是一种更好的方法,声明一些不需要的东西通常不是一个好主意。这使得在多线程或共享VM (例如应用服务器)场景中使用您的代码变得困难。
此外,通常还有更好的方法来实现线程安全,而不是在单个对象上自由使用synchronized关键字。您可以考虑使用具有配置为使用单线程的ThreadPoolExecutor的BlockingQueue。
https://stackoverflow.com/questions/52281416
复制相似问题