[英]Synchronized locks in java
我有多线程应用程序(例如servlet)。 我也有一个公共资源(文件,引用或其他东西)。 如何同步其访问? 这是我的方法:
static Object lock = new Object();
volatile int commonRes = 0;
public void doSomething() {
System.out.println("Before statement " + commonRes);
synchronized (lock) {
//some process
commonRes++;
}
//Do something else
System.out.println("After statement " + commonRes);
}
我有两个问题:
lock
应该是volatile
吗? 如果两个线程都使用同一对象引用同一文件,则不需要单独的static
对象。 由于您的课程是从Object
派生的,因此您也可以使用
synchronized(this) { ... }
或涵盖整个方法的简写形式
public synchronized void doSomething() { ... }
volatile
包含在synchronized
访问中-锁定原语意识到它们需要是线程安全的。
这是好方法吗?
在多线程环境中锁定资源始终是好的,但是据我所知,将资源标记为volatile
并在资源上进行同步是多余的,因为两者在发布的方案中几乎完成了相同的任务。
当我使用同步块时,我更喜欢像这样锁定类:
synchronized(MyClass.class) {
...
}
为什么我这样做:
在大多数情况下,仍然像您一样使用synchronized
块也是可以的(有点像我喜欢做的一样),但是,如果遇到问题(性能,您无法完成的事情,饥饿),我建议使用类似ReentrantLock
。
它提供了更大的灵活性,并可能提供一些额外的性能。 它还可以完成synchronized
块无法完成的任务。
同样,在某些情况下,诸如ReadWriteLock
或ReentrantReadWriteLock
也可以为您提供ReentrantReadWriteLock
服务,因此也值得一读。
锁应该是易失的吗?
据我所知,没有任何理由。 锁定对象暗示为volatile
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.