Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的同步锁_Java_Multithreading - Fatal编程技术网

java中的同步锁

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

我有多线程应用程序(例如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
    是否应
    易失性

  • 如果两个线程使用相同的对象引用相同的文件,则不需要单独的
    静态对象。由于您的类是从
    对象
    派生的,因此您还可以使用

    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):