synchronized的对象锁和类锁

Posted zheaven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了synchronized的对象锁和类锁相关的知识,希望对你有一定的参考价值。

概念

synchronized 是 Java 中的关键字,是利用锁的机制来实现同步的。

锁机制有如下两种特性:

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

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

对象锁

synchronized修饰非静态方法时是对象锁,等同于synchronized(this),在同一个对象中是线程安全的。

package com.dwz.concurrency.chapter7;
/**
 *     两个方法锁定的都是this即同一个对象thisLock,
 *     同时调用的结果是一个执行完再执行下一个
 */
public class SynchronizedThis {
    public static void main(String[] args) {
        ThisLock thisLock = new ThisLock();
        new Thread("T1") {
            @Override
            public void run() {
                thisLock.m1();
            }
        }.start();
        
        new Thread("T2") {
            @Override
            public void run() {
                thisLock.m2();
            }
        }.start();
    }
}

class ThisLock {
  public synchronized void m1() { try { System.out.println(Thread.currentThread()); Thread.sleep(10_000); } catch (InterruptedException e) { e.printStackTrace(); } } public synchronized void m2() { try { System.out.println(Thread.currentThread()); Thread.sleep(10_000); } catch (InterruptedException e) { e.printStackTrace(); } } }

 执行结果:m1和m2先后执行

以上是关于synchronized的对象锁和类锁的主要内容,如果未能解决你的问题,请参考以下文章

synchronized的对象锁和类锁

Java对象锁和类锁全面解析(多线程synchronized关键字)

Java对象锁和类锁全面解析(多线程synchronized关键字)

java对象锁和类锁全面解析(多线程synchronized关键字)

Java类锁和对象锁实践(good)

类锁和对象锁,synchronized修饰static方法与非static方法的区别