首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >内部有同步块的静态方法,阻塞java中的整个类?

内部有同步块的静态方法,阻塞java中的整个类?
EN

Stack Overflow用户
提问于 2018-09-12 01:38:53
回答 1查看 321关注 0票数 0

我有一个执行3个线程的类,在每个线程上,我都会询问并检查全局变量。我试图单独地锁定每个变量,我不想每次更改一个变量时都阻塞整个类。我研究了一下,但我还是很困惑。在这种情况下,因为我必须从每个线程访问变量,所以我必须使方法成为静态的,所以我的问题是:每次调用getter和setter时,我都会阻塞每个变量或整个类?

代码语言:javascript
复制
 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;
        }
    }

}
EN

回答 1

Stack Overflow用户

发布于 2018-09-12 04:22:03

不,你没有阻塞类,你的静态方法没有声明为synchronized,你也没有阻塞类的实例,因为你的类没有实例。

但是,为了从单独的线程调用方法,没有必要将方法声明为静态的。如果您不声明任何静态内容并在单个实例上调用这些方法,那么您的代码将以相同的方式工作。这也是一种更好的方法,声明一些不需要的东西通常不是一个好主意。这使得在多线程或共享VM (例如应用服务器)场景中使用您的代码变得困难。

此外,通常还有更好的方法来实现线程安全,而不是在单个对象上自由使用synchronized关键字。您可以考虑使用具有配置为使用单线程的ThreadPoolExecutor的BlockingQueue。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52281416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档