美文网首页
理解Java中的synchronized关键字

理解Java中的synchronized关键字

作者: 好酸的柠檬 | 来源:发表于2018-05-12 17:58 被阅读0次

目标

理解synchronized的含义、明确synchronized关键字修饰普通方法、静态方法和代码块时锁对象的差异。

作业

问题1:
有如下一个类A

class A {
    public synchronized void a() {
    }
    public synchronized void b() {
    }
}

然后创建两个对象
A a1 = new A();
A a2 = new A();

然后在两个线程中并发访问如下代码:
Thread1 Thread2
a1.a(); a2.a();

请问二者能否构成线程同步?
问题2:如果A的定义是下面这种呢?

class A {
    public static synchronized void a() {
    }

    public static synchronized void b() {
    }
}

synchronized关键字的含义

synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

synchronized的三种应用方式

1. 修饰普通方法

锁的是当前类的实例对象;多线程中不同对象访问此方法,无法保证同步。

线程A、B访问object的方法(包含同步和异步方法),假设A持有了object对象的Lock锁,B线程如果在这时调用object对象中的synchronized类型的方法则需要等待,也就是同步,但是B此时可以异步访问object的非synchronized方法。

2. 修饰静态方法

锁的是当前类,synchronized加到static静态方法上是给Class类上锁;多线程中不同对象访问此方法,可以保证同步。

3. 修饰代码块

如Synchronized(obj) 这里的obj 可以为类中的一个属性、也可以是当前的对象,它的同步效果和修饰普通方法一样;Synchronized方法 (obj.class)静态代码块它的同步效果和修饰静态方法类似。
当一个线程访问object的一个synchronized同步代码块时,另一个线程仍然可以访问该object对象中的非synchronized(this)同步代码块。

synchronized其他知识点

  • 自己可以再次获取自己的内部锁。
  • 当一个线程执行的的代码出现异常时,其所持有的锁会自动释放。
  • 同步不具有继承性,所以还得在子类的方法中添加synchronized关键字。

总结

  • 问题1:不能同步,多线程锁的是不同对象。
  • 问题2:同步,多线程锁的是当前类,是同一把锁(A.class)。

相关文章

网友评论

      本文标题:理解Java中的synchronized关键字

      本文链接:https://www.haomeiwen.com/subject/skpolftx.html