简述synchronized及CAS

本文简要介绍了Java中的synchronized关键字,包括其三种使用方式和锁升级机制,并对比了与lock锁的区别。此外,文章还探讨了CAS(Compare And Swap)乐观锁的概念及其在多线程一致性维护中的应用,以及CAS与AQS(AbstractQueuedSynchronizer)的关系,AQS作为许多同步工具锁的基础,如ReentrantLock和CyclicBarrier。
摘要由CSDN通过智能技术生成

简述一下synchronized

Synchronized总共有三种用法:

  1. 当synchronized作用在实例方法时,监视器锁(monitor)便是对象实例(this);
  2. 当synchronized作用在静态方法时,监视器锁(monitor)便是对象的Class实例,因为Class数据存在于永久代,因此静态方法锁相当于该类的一个全局锁;
  3. 当synchronized作用在某一个对象实例时,监视器锁(monitor)便是括号括起来的对象实例;
    注意,synchronized 内置锁 是一种 对象锁(锁的是对象而非引用变量),作用粒度是对象 ,可以用来实现对 临界资源的同步互斥访问 ,是 可重入 的。其可重入最大的作用是避免死锁,如:子类同步方法调用了父类同步方法,如没有可重入的特性,则会发生死锁;

Synchronized的语义底层是通过一个监视器锁monitor的对象来完成,其实wait/notify等方法也依赖于monitor对象,这就是为什么只有在同步的块或者方法中才能调用wait/notify等方法,

同时Synchronized是悲观锁,线程开始执行第一步就是获取锁,一旦获得锁,其他的线程进入后就会阻塞等待锁。如果不好理解,举个生活中的例子:一个人进入厕所后首先把门锁上(获取锁),然后开始上厕所,这个时候有其他人来了只能在外面等(阻塞),就算再急也没用。上完厕所完事后把门打开&

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
synchronized 和 lock 都是 Java 中用于实现线程同步的机制,它们的作用都是保证在同一时刻只有一个线程能够访问共享资源。它们的原理有一些不同。 synchronizedJava 语言中的关键字,它是在 JVM 层面上实现的。它的机制是,每个 Java 对象都有一个监视器锁(monitor),当一个线程访问该对象的 synchronized 代码块时,会尝试获取该对象的监视器锁,如果获取到锁,则表示该线程可以进入 synchronized 代码块执行,其他线程则必须等待。当 synchronized 代码块执行完毕时,该线程会释放锁,其他线程则可以尝试获取锁并进入 synchronized 代码块执行。 lock 是 Java 5 中引入的一个接口,它提供了比 synchronized 更加灵活和强大的线程同步机制。lock 接口的实现类可以实现不同的锁定策略,比如可重入锁、公平锁、读写锁等。lock 接口中最常用的实现类是 ReentrantLock。lock 的机制是,一个线程在访问共享资源前,必须先获取锁,如果获取不到锁,则该线程会被阻塞,直到获取到锁才能进入临界区访问共享资源。当线程访问完共享资源后,必须释放锁,其他线程才能获取锁访问共享资源。 总的来说,synchronizedJava 的内置机制,使用起来比较简单,但是锁定的粒度比较大,只能锁定整个对象,不能灵活控制锁定范围。而 lock 则是一个接口,使用起来比较灵活,可以实现不同的锁定策略,但是也比较复杂,需要手动加锁和解锁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值