在使用Java进行性能测试过程中,经常会遇到线程同步代码锁的使用,同步内容的对象、方法、代码块。

同步是使所有并发线程在执行中保持同步的过程。同步避免了由于共享内存视图不一致而导致的内存一致性错误。当方法被声明为同步时,该线程持有监视器或锁定对象为这个方法的对象。如果另一个线程正在执行同步方法,则该线程将被阻塞,直到该线程释放这个锁。

对象级别锁

对象级锁是机制,当我们要同步非静态方法或者非静态代码块,使得只有一个线程就可以在类的给定实例执行的代码块,以确保实例级数据线程安全。对象级别锁定可以通过以下方式完成:

public class DemoClass {

    public synchronized void demoMethod() {
         //搞点事情()
    }
}


public class DemoClass {

    public void demoMethod() {
        synchronized (this) {
            //搞点事情()
        }
    }
}


public class DemoClass {

    private final Object lock = new Object();

    public void demoMethod() {
        synchronized (lock) {
            //搞点事情()
        }
    }
}

类级别锁

类级别锁可防止多个线程synchronized在运行时进入该类的所有可用实例中的任何一个块中。这意味着,如果在运行时有 100 个实例DemoClass,则一次只能在一个实例中的一个线程上执行一个线程demoMethod(),而所有其他实例将被其他线程锁定。

应该始终执行类级别锁定,以使静态数据线程安全。我们知道static关键字将方法的数据关联到类级别,因此在静态字段或方法上使用锁定使其成为类级别。

public class DemoClass {

    public synchronized static void demoMethod() {
            //搞点事情()
    }
}

public class DemoClass {

    public void demoMethod() {
        synchronized (DemoClass.class) {
            //搞点事情()
        }
    }
}

public class DemoClass {

    private final static Object lock = new Object();

    public void demoMethod() {
        synchronized (lock) {
            //搞点事情()
        }
    }
}

重要说明


技术类文章精选

无代码文章精选


↙↙↙阅读原文可查看相关链接,并与作者交流