【问题标题】:How to make thread safe of a static variable in a web contronller如何使 Web 控制器中的静态变量的线程安全
【发布时间】:2019-04-14 19:54:48
【问题描述】:

据我所知,默认情况下控制器是单例范围。如果控制器中有静态变量,我怎样才能使它成为线程安全的?

除了使用同步的方式来处理,还有其他的方法吗?

【问题讨论】:

  • 使变量线程安全并不意味着什么。我们不知道变量的类型、它包含的内容、它是否是最终的、它何时被初始化、它的用途、它是否以及何时发生变异等等。

标签: java spring servlets thread-safety


【解决方案1】:

您可以使用ReadWriteLock 对某些共享对象执行线程安全的读/写操作:

import java.util.concurrent.locks.*;

public class Something {
    private static SomeObject object = new SomeObject();
    private static ReadWriteLock objectLock = new ReentrantReadWriteLock();

    public void doSomething() {
        objectLock.readLock().lock();
        try {
            //reading something from object
        } finally {
            objectLock.readLock().unlock();
        }

        objectLock.writeLock().lock();
        try {
            //writing something in object
        } finally {
            objectLock.writeLock().unlock();
        }
    }
}

请注意,在此示例中,如果 object 变量的值发生变化(而不是对象本身),则应使用 volatile 修饰符声明它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    相关资源
    最近更新 更多