【JavaSE8 基础 Keyword】synchronized关键字总结 2019_7_25

用途

官方:synchronnized方法在执行前获取一个监视器
原文 :A synchronized method acquires a monitor (§17.1) before it executes.

简单翻译:synchronize保证一个方法只被一个线程使用,在同一时间内

概念

监视器

1.1对于类(静态)方法来说——监视器是与类对象联系(绑定)在一起,在方法所在类被使用时。

1.2对于实例方法来说——监视器与当前synchronized方法调用者this对象联系(绑定)在一起,在this被使用时。

原文:
For a class (static) method, the monitor associated with the Class object for the method’s class is used.
For an instance method, the monitor associated with this (the object for which the method was invoked) is used.

锁机制

synchronized 利用锁的机制来实现同步

两种特性

互斥性

即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机制,这样在同一时间只有一个线程对需同步的代码块(复合操作)进行访问。互斥性我们也往往称为操作的原子性

可见性

必须确保在锁被释放之前,对共享变量所做的修改对于随后获得该锁的另一个线程是可见的(即在获得锁时应获得最新共享变量的值),否则另一个线程可能是在本地缓存的某个副本上继续操作从而引起不一致。

两种锁

对象锁

在 Java 中,每个对象都会有一个 monitor 对象,这个对象其实就是 Java 对象的锁,通常会被称为“内置锁”或“对象锁”。类的对象可以有多个,所以每个对象有其独立的对象锁,互不干扰。

类锁

在 Java 中,针对每个类也有一个锁,可以称为“类锁”,类锁实际上是通过对象锁实现的,即类的 Class 对象锁。每个类只有一个 Class 对象,所以每个类只有一个类锁。

用法分类

synchronized 的用法可以从两个维度上面分类:

根据修饰对象分类

synchronized 可以修饰方法和代码块

  • 修饰代码块
  1. synchronized(this|object) {}

  2. synchronized(类.class) {}

  • 修饰方法
  1. 修饰非静态方法

  2. 修饰静态方法

根据获取的锁分类

  • 获取对象锁
  1. synchronized(this|object) {}

  2. 修饰非静态方法

  • 获取类锁
  1. synchronized(类.class) {}

  2. 修饰静态方法

作者:Sunmi_Android
链接:https://juejin.im/post/594a24defe88c2006aa01f1c
来源:掘金

简单实例

//修饰方法
class Test {
    //1.1静态(类)方法,获取类锁
    static int classCount;
    static synchronized void classBump() {
        classCount++;
    }
    int count;
    //1.2实例方法,获取调用者caller的对象锁
    synchronized void bump() {
        count++;
    }
}

/**同等效果**/

//2.修饰陈述Statement/代码块
class BumpTest {
    int count;
    void bump() {
    	//2.1获取this调用者caller的对象锁
        synchronized (this) { count++; }
    }
    static int classCount;
    static void classBump() {
        try {
        	//2.2获取Class.forName("BumpTest")类锁
            synchronized (Class.forName("BumpTest")) {
                classCount++;
            }
        } catch (ClassNotFoundException e) {}
    }
}

补充:
复杂实例–Sunmi_Android的倔强博文
java中synchronized关键字的用法

我个人对Sunmi提供的实例解析文章:
【JavaSE8 基础 Keyword】synchronized复杂实例解析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值