当前位置: 首页 > 知识库问答 >
问题:

基于声明为“final static对象”的对象与仅“最终对象”[重复]的同步

戚正业
2023-03-14

我有一个关于Java并发性的问题。如果我基于一个对象同步一个临界区,那么将该变量声明为< code >final static对象与简单地声明为< code >最终对象有什么区别?

我知道 static 关键字将变量定义为属于该类,但我对它在多线程环境中的含义有点模糊。

请参阅下面的代码示例。目前,我将lock对象声明为private final object lock=new object(),如果我添加statickeyword,会有什么不同?

class ConcurrencySample {
    private String message = null;
    private final Object lock = new Object();
    //private final static Object lock = new Object();

    public void setMessage(String msg) {
        synchronized (lock) {
            message = msg;
        }
    }
    public String getMessage() {
        synchronized (lock) {
            String temp = message;
            message = null;
            return temp;
        }
    } 
}

谢谢你的帮助!

共有2个答案

凌永逸
2023-03-14

使lock变量静态将使任何读取或写入消息的线程针对ConloccySample的任何实例阻塞,而不是仅阻塞正在被另一个线程读取的特定实例。

这基本上会降低应用程序的并发级别:在任何实例上,只有一个线程可以读取或写入消息,即使其他线程想要影响完全不同的实例。

西门骁
2023-03-14

如果将该对象声明为< code>static final,则该类的所有实例之间正好共享一个锁。这意味着,如果两个独立的实例都试图在其上同步,那么每次只有一个实例能够获得锁。

如果您将对象声明为Final,则每个类实例都有一个锁副本,因此如果该类的两个独立实例都尝试获取锁,则它们各自获取自己的锁,因此不涉及阻塞。但是,如果多个线程同时调用该类一个实例的方法,则这些线程将尝试获取相同的对象,因此一次只能继续一个线程。

希望这有帮助!

 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : 10年前关闭。 可能重复: 何时使用最终版 为对象 声明关键字有什么用?例如: 问题答案: 使用“ final”关键字可使您声明的变量不变。最初分配后,将无法重新分配。 但是,这不一定意味着变量引用的实例状态是不可变的,仅引用本身是不可变的。 在变量上使用“ final”关键字有几个原因。一种是优化,通过将变量声明为final来允许值被记忆。 使用最终变

  • 问题内容: 如何将类属性声明为对象? 我试过了: 但这没有用。另外,为什么要那样做呢? 只实例化该对象并使用其成员不是更好吗? 问题答案: 从有关类属性的PHP手册(重点是我的): 类成员变量称为“属性”。您可能还会看到使用其他术语(例如“属性”或“字段”)来引用它们,但是出于参考目的,我们将使用“属性”。它们是使用关键字public,protected或private之一定义的,后跟普通变量声明

  • Kotlin 用对象表达式和对象声明来实现创建一个对某个类做了轻微改动的类的对象,且不需要去声明一个新的子类。 对象表达式 通过对象表达式实现一个匿名内部类的对象用于方法的参数中: window.addMouseListener(object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { //

  • 我想基于输入参数同步一个方法或一个块。 因此,我有一个API,它在post有效负载中有两个长类型的输入(比如id1和id2),可以是原始的,也可以是包装的),可以是JSON。这个API将被多个线程同时或随机地在不同时间调用。 现在如果第一个API调用有ID1=1和ID2=1,同时另一个API调用有ID1=1和ID2=1,它应该等待第一个API调用处理完毕后再执行第二个调用。如果第二个API调用具有

  • 问题内容: 为对象 声明关键字有什么用?例如: 问题答案: 使用“ final”关键字可使您声明的变量不变。最初分配后,将无法重新分配。 但是,这不一定意味着变量引用的实例状态是不可变的,仅引用本身是不可变的。 在变量上使用“ final”关键字有几个原因。一种是优化,通过将变量声明为final来允许值被记忆。 使用最终变量的另一种情况是方法中的内部类需要访问声明方法中的变量。以下代码说明了这一点

  • 问题内容: 问题在于确定以下符号之间的权衡: 基于JSON : 基于数组 : 关于同一问题的这篇文章,我已经决定(在前端)使用JSON对象表示法而不是对象数组,因为它符合我的要求,更好的性能和更少的浏览器代码。 但是问题在于列表本身不是静态的。我的意思是,该列表正在生成,即从DB(NoSQL)获取/存储,并通过服务器上的JavaAPI为新条目创建。我无法决定在后端应使用哪种表示法(最终也会影响UI