【发布时间】:2019-04-14 19:54:48
【问题描述】:
据我所知,默认情况下控制器是单例范围。如果控制器中有静态变量,我怎样才能使它成为线程安全的?
除了使用同步的方式来处理,还有其他的方法吗?
【问题讨论】:
-
使变量线程安全并不意味着什么。我们不知道变量的类型、它包含的内容、它是否是最终的、它何时被初始化、它的用途、它是否以及何时发生变异等等。
标签: java spring servlets thread-safety
据我所知,默认情况下控制器是单例范围。如果控制器中有静态变量,我怎样才能使它成为线程安全的?
除了使用同步的方式来处理,还有其他的方法吗?
【问题讨论】:
标签: java spring servlets thread-safety
您可以使用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 修饰符声明它。
【讨论】: