美文网首页
03|04 互斥锁

03|04 互斥锁

作者: random123 | 来源:发表于2020-05-21 22:43 被阅读0次

上一篇主要讲了可见性和顺序性问题,互斥锁主要解决原子性问题。

锁模型

锁模型中除了要知道临界区,还要明确锁要保护的资源

锁与被保护资源的关联关系: N:1  一个锁保护多个资源

synchronized

java语言提供的一种锁的实现,自动加上lock()和unlock()。当修饰静态方法的时候,锁定的是当前类的 Class 对象,在上面的例子中就是 Class X;当修饰非静态方法的时候,锁定的是当前实例对象 this.

synchronized保证了原子性,通过happens-before原则也可以保证顺序性和可见性

所谓原子性,字面意思是不可分割,本质是操作的中间状态对外不可见

XXX.class可以作为共享锁,对所有此类的对象共享。虽然可以解决多个关联对象操作的原子性问题,但是这种粗粒度锁导致性能下降。

本节问题:在第一个示例程序里,用了两把不同的锁来分别保护账户余额、账户密码,创建锁的时候,我们用的是:private final Object xxxLock = new Object();,如果账户余额用 this.balance 作为互斥锁,账户密码用 this.password 作为互斥锁,你觉得是否可以呢?

回答:不可以。 1.可变对象不能用于锁,一旦对象改变,加锁失效。   2.Integer/String/Boolean类型不适合做锁。

1.比如有线程A、B、C    线程A首先拿到balance1锁,线程B这个时候也过来,发现锁被拿走了,线程B被放入一个地方进行等待。当A修改掉变量balance的值后,锁由balance1变为balance2.线程B也拿到那个balance1锁,这时候刚好有线程C过来,拿到了balance2锁。由于B和C持有的锁不同,所以可以同时执行这个方法来修改balance的值,这个时候就有可能是线程B修改的值会覆盖掉线程C修改的值

2.因为Integer/String/Boolean对象可能会被重用。比如Integer a = 1;  Integer b = 1;  a和b实际上是同一个对象(Integer缓存 -128~127之间的数),同理,看似是两个锁,实际是一个锁,这就是风险。

相关文章

  • 03|04 互斥锁

    上一篇主要讲了可见性和顺序性问题,互斥锁主要解决原子性问题。 锁模型中除了要知道临界区,还要明确锁要保护的资源 锁...

  • 03 互斥锁

    synchronized 关键字 修饰静态方法:定的是当前类的 Class 对象 修饰非静态方法:锁定的是当前实例...

  • 线程同步与互斥

    Linux--线程编程 多线程编程-互斥锁 线程同步与互斥 互斥锁 信号量 条件变量 互斥锁 互斥锁的基本使用...

  • Golang 锁的相关知识

    Golang锁分类:互斥锁(Mutex)、读写锁(RWMutex)。 互斥锁 在编写代码中引入了对象互斥锁的概念,...

  • iOS底层探索-多线程锁

    多线程的锁大致可分为两大类:互斥锁、自旋锁;也可以分为三类:互斥锁、自旋锁、读写锁。 一、互斥锁:互斥+同步(强调...

  • go-锁机制

    Golang中的锁机制主要包含互斥锁和读写锁 互斥锁 互斥锁是一种简单的加锁的方法来控制对共享资源的访问,互斥锁只...

  • 线程锁

    1.常见的锁包括:互斥锁,自旋锁。 2.互斥锁是指锁的类型,自旋锁是指锁的实现方式。 3.互斥锁:当上...

  • 算法:读写者问题

    锁解析 : RWMutex : 读-写互斥锁 WWMutex : 写-写互斥锁 WPriorityMutex =...

  • 可重入读写锁 ReentrantReadWriteLock

    读写锁分为读锁和写锁,多个线程获取读锁不互斥,读写锁、写写锁互斥。 输出

  • C++锁

    锁的种类 互斥锁、条件锁、自旋锁、读写锁、递归锁。 互斥锁 头文件: 类型:pthread_mutex_t, 函数...

网友评论

      本文标题:03|04 互斥锁

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