java中的同步锁
我有多线程应用程序(例如servlet)。我也有一个共同点 资源(文件、引用或其他)。如何同步其访问?我就是这样做的:java中的同步锁,java,multithreading,Java,Multithreading,我有多线程应用程序(例如servlet)。我也有一个共同点 资源(文件、引用或其他)。如何同步其访问?我就是这样做的: static Object lock = new Object(); volatile int commonRes = 0; public void doSomething() { System.out.println("Before statement " + commonRes); synchronized (l
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
是否应易失性
如果两个线程使用相同的对象引用相同的文件,则不需要单独的
静态对象。由于您的类是从对象
派生的,因此您还可以使用
synchronized(this) { ... }
或者是涵盖整个方法的速记表
public synchronized void doSomething() { ... }
volatile
隐含在synchronized
访问中——锁定原语知道它们需要线程安全。如果两个线程使用相同的对象引用相同的文件,则不需要单独的static
对象。由于您的类是从对象
派生的,因此您还可以使用
synchronized(this) { ... }
或者是涵盖整个方法的速记表
public synchronized void doSomething() { ... }
volatile
隐含在synchronized
访问中——锁定原语知道它们需要线程安全
这是个好办法吗
在多线程环境中锁定资源总是好的,但就我所知,将资源标记为volatile和同步是多余的,因为两者在发布的场景中完成几乎相同的事情
当我使用同步块时,我更喜欢这样锁定类:
synchronized(MyClass.class) {
...
}
我为什么这样做:
- 静态和非静态方法都将被阻止
- 没有其他外部对象能够锁定您的对象并可能创建细微的bug
在大多数情况下,仍然像您那样使用synchronized
块也是可以的(有点像我喜欢做的),但是如果您遇到问题(性能、无法完成的事情、饥饿),我建议使用类似的结构。
它提供了更多的灵活性,可以提供一些额外的性能。它还可以完成同步
块无法完成的事情
另外,类似于ReadWriteLock
或的东西在某些场景中也能很好地为您服务,因此它们也值得一读
锁应该是易变的吗
据我所知,没有理由这样做。锁定对象暗示为
volatilelike
这是个好办法吗
在多线程环境中锁定资源总是好的,但就我所知,将资源标记为volatile和同步是多余的,因为两者在发布的场景中完成几乎相同的事情
当我使用同步块时,我更喜欢这样锁定类:
synchronized(MyClass.class) {
...
}
我为什么这样做:
- 静态和非静态方法都将被阻止
- 没有其他外部对象能够锁定您的对象并可能创建细微的bug
synchronized
块也是可以的(有点像我喜欢做的),但是如果您遇到问题(性能、无法完成的事情、饥饿),我建议使用类似的结构。它提供了更多的灵活性,可以提供一些额外的性能。它还可以完成
同步
块无法完成的事情
另外,类似于ReadWriteLock
或的东西在某些场景中也能很好地为您服务,因此它们也值得一读
锁应该是易变的吗
据我所知,没有理由这样做。锁定对象被暗示为易变的。您不能简单地锁定访问资源的方法吗?使用诸如public synchronized void doSomething()之类的东西?我不需要同步。整个方法。方法可以写入文件或执行一些繁重的处理。非静态字段的静态锁对我来说没有意义。您不能简单地锁定访问资源的方法吗?使用诸如public synchronized void doSomething()之类的东西?我不需要同步。整个方法。方法可以写入文件或执行一些繁重的处理。非静态字段的静态锁对我来说没有意义。锁定
这个不是很好。如果客户机决定锁定对象的引用,您将遇到问题。此外,它也不能解决静态和非静态方法同步的问题。请检查此答案,以查看更详细的原因版本(即使它是c#-ish):锁定此
不是很好。如果客户机决定锁定对象的引用,您将遇到问题。此外,它也不能解决静态和非静态方法同步的问题。请检查此答案,以查看更详细的原因版本(即使是c#ish):