java - 类级锁定中的静态变量行为

标签 java multithreading

我需要清楚地了解类级别锁定中的静态变量行为。

场景: 考虑以下名为 Data 的类。

public class Data {

    private static int i = 1;
    private static int j = 1;


    public void updateI() {
        synchronized (Data.class) {
            ++i;
            System.out.println(fmt() + " > " + Thread.currentThread().getName() + (" UPDATED > "+ i));
        }
    }

    public void getJ() {
        System.out.println(fmt() + " > " + Thread.currentThread().getName() + (" READ > "+ j));
    }
}

这里,

  • Thread-A 调用 updateI() 方法并获取锁。
  • 同时 Thread-B 正在调用 getJ() 方法。
  • 会不会阻塞Thread-B 因为类级锁已经被 Thread-A 获取了? 或者它将允许 同时访问这两种方法?

谢谢....

最佳答案

简而言之 - 它不会被锁定。

如果你想让它被锁定,你还需要保护 getJ 函数:

public void getJ() {
    synchronized (Data.class) {
        System.out.println(fmt() + " > " + Thread.currentThread().getName() + (" READ > "+ j));
    }
}

这与静态变量无关。变量本身不能被锁定。只能访问它们。如果您允许通过 getJ 解锁访问,没有什么可以阻止您。

关于java - 类级锁定中的静态变量行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58504516/

相关文章:

c# - 按时间取消任务

java - 流程卡在流程构建器上

javascript - 在 JavaScript 中从 Servlet 引用 Java 列表

java - Camel、JAXB 到 ActiveMQ 自动创建 XML

java - 如何让服务器自动将数据发送回连接的客户端

Java,关于缓存大量 GB 的策略有帮助吗?

java - 以编程方式按住java键

java - jlist get 和 set 选择损坏?

管理线程池的 Pythonic 方式

java - "Closing"阻塞队列