非静态方法上加 Synchronized

Synchronzied 修饰非静态方法==》对象锁

Synchronzied 修饰静态方法==》其实是类锁,因为是静态方法,它把整个类锁起来了;

什么时候选择在非静态方法上Synchronzied ?

首先我们要知道,加载非静态方法上是对象锁,一个class类模板可以复制出无数的类,也就是说在非静态方法上加Synchronzied ,只能达到当前的这个类中的各种操作是线程安全的。多个线程同时操作一个对象为前提。

以下列代码为例:

@Slf4j
public class TesThread {

    volatile int a = 1;
    volatile int b = 1;
    public synchronized void add() {
        log.info("add start");
        for (int i = 0; i < 10000; i++) {
            a++;
            b++;
        }
        log.info("add done");
    }
    public synchronized void compare() {
        log.info("compare start");
        for (int i = 0; i < 10000; i++) {
//a始终等于b吗?
            if (a < b) {
                log.info("a:{},b:{},{}", a, b, a > b);
//最后的a>b应该始终是false吗?
            }
        }
        log.info("compare done");
    }

    public static void main(String[] args) {
        TesThread interesting = new TesThread();
        new Thread(() -> interesting.add()).start();
        new Thread(() -> interesting.compare()).start();
    }
}

在当前对象的操作下,无疑是线程安全的,这个前提条件在某种程度下对应了单例模式


版权声明:本文为jj89929665原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。