Java并发编程入门(六)synchronized用法

2,338 阅读2分钟

banner窄.png

铿然架构  |  作者  /  铿然一叶 这是铿然架构的第 36 篇原创文章

相关阅读:

Java并发编程(一)知识地图
Java并发编程(二)原子性
Java并发编程(三)可见性
Java并发编程(四)有序性
Java并发编程(五)创建线程方式概览
Java并发编程入门(七)轻松理解wait和notify以及使用场景
Java并发编程入门(八)线程生命周期
Java并发编程入门(九)死锁和死锁定位
Java并发编程入门(十)锁优化
Java并发编程入门(十一)限流场景和Spring限流器实现
Java并发编程入门(十二)生产者和消费者模式-代码模板
Java并发编程入门(十三)读写锁和缓存模板
Java并发编程入门(十四)CountDownLatch应用场景
Java并发编程入门(十五)CyclicBarrier应用场景
Java并发编程入门(十六)秒懂线程池差别
Java并发编程入门(十七)一图掌握线程常用类和接口
Java并发编程入门(十八)再论线程安全
Java并发编程入门(十九)异步任务调度工具CompleteFeature
Java并发编程入门(二十)常见加锁场景和加锁工具


一、作用域

synchronized关键字的作用域有:
1.静态方法

    public static synchronized void increase() {
        count = count + 1;
    }

2.实例方法

    public synchronized int getCount() {
        return count;
    }

3.代码块

    public static void decrease() {
        synchronized (SynchronizedDemo.class) {
            count = count - 1;
        }
    }

二、加锁对象

synchronized加锁的对象有:
1.锁定的对象为类类型
2.锁定的对象为类实例对象
例如:

public class SynchronizedDemo {

    private static int count = 0;

    //锁定对象为SynchronizedDemo.class
    public static synchronized void increase() {
        count = count + 1;
    }

    public static void decrease() {
        //锁定对象为SynchronizedDemo.class
        synchronized (SynchronizedDemo.class) {
            count = count - 1;
        }
    }

    //锁定对象为为SynchronizedDemo类的某个实例
    public synchronized int getCount() {
        return count;
    }

    public void print() {
        //锁定对象为SynchronizedDemo类的某个实例
        synchronized (this) {
            System.out.println(count);
        }
    }
}

三、关键点

1.synchronized加锁互斥且阻塞的,如果A已经获得锁,则B要等A执行完后才能执行。
2.锁定的对象如果不是同一个则不会阻塞,例如在同一个类的静态方法和实例方法上都有synchronized关键字,但它们不是同一个锁,因此互不影响。
3.锁定的对象必须是不变的,否则锁会发生变化,导致并发时处理结果不正确。

end.


<--阅过留痕,左边点赞 !