多线程并发编程笔记04(小滴课堂)---锁

锁的分类:
多线程并发编程笔记04(小滴课堂)---锁_第1张图片

 多线程并发编程笔记04(小滴课堂)---锁_第2张图片

 lock的使用:

多线程并发编程笔记04(小滴课堂)---锁_第3张图片

多线程并发编程笔记04(小滴课堂)---锁_第4张图片

多线程并发编程笔记04(小滴课堂)---锁_第5张图片

那lock和synchronized的区别是什么呢?
 

 多线程并发编程笔记04(小滴课堂)---锁_第6张图片

实现属于自己的锁:

多线程并发编程笔记04(小滴课堂)---锁_第7张图片

多线程并发编程笔记04(小滴课堂)---锁_第8张图片

多线程并发编程笔记04(小滴课堂)---锁_第9张图片

多线程并发编程笔记04(小滴课堂)---锁_第10张图片

多线程并发编程笔记04(小滴课堂)---锁_第11张图片

多线程并发编程笔记04(小滴课堂)---锁_第12张图片

通过运行结果我们发现,好像出现了一种死锁的感觉,没有成功重入,这是不对的,所以我们要去改我们的自定义锁:

 多线程并发编程笔记04(小滴课堂)---锁_第13张图片

 多线程并发编程笔记04(小滴课堂)---锁_第14张图片

 多线程并发编程笔记04(小滴课堂)---锁_第15张图片

这样改动之后我们就可以完成重入功能了。 

多线程并发编程笔记04(小滴课堂)---锁_第16张图片

 多线程并发编程笔记04(小滴课堂)---锁_第17张图片

 多线程并发编程笔记04(小滴课堂)---锁_第18张图片

 

多线程并发编程笔记04(小滴课堂)---锁_第19张图片

多线程并发编程笔记04(小滴课堂)---锁_第20张图片 多线程并发编程笔记04(小滴课堂)---锁_第21张图片

我们可以发现这个值是不对的。

因为由于线程休眠,会导致j没有+1就被读到了值。

而按照我们之前学习的我们应该可以使用synchronized关键字修饰方式来通过加锁的方式做到线程安全。但是这种做法太浪费资源了,我们是想在写的时候,其它线程不能去写也不能去读,但是读的时候所有线程都可以读,但是不能写。

这种情况我们就可以使用读写锁:

 多线程并发编程笔记04(小滴课堂)---锁_第22张图片

多线程并发编程笔记04(小滴课堂)---锁_第23张图片

我们现在加上了读锁和写锁,再去运行:

多线程并发编程笔记04(小滴课堂)---锁_第24张图片

 值都是3,证明i和j都是一样的。

可以在控制台尝试读读,读写,写写操作,进行线程debug,可以发现读读是共享,其它操作都是互斥的。

多线程并发编程笔记04(小滴课堂)---锁_第25张图片

多线程并发编程笔记04(小滴课堂)---锁_第26张图片

锁降级:

多线程并发编程笔记04(小滴课堂)---锁_第27张图片

有这样一段简单的代码,我们先调用写锁,再调用读锁:

 多线程并发编程笔记04(小滴课堂)---锁_第28张图片

注意点: 降级之后,写锁并不会直接降级成读锁,不会随着读锁的释放而释放,因此需要显式的释放写锁。

是否有锁升级?

多线程并发编程笔记04(小滴课堂)---锁_第29张图片

多线程并发编程笔记04(小滴课堂)---锁_第30张图片

没有运行出结果。

说明在这个类里不存在锁升级。

 多线程并发编程笔记04(小滴课堂)---锁_第31张图片

 

 多线程并发编程笔记04(小滴课堂)---锁_第32张图片

值都是4,肯定是不符合我们的预期的。

这时我们就可以使用我们的读写锁。

多线程并发编程笔记04(小滴课堂)---锁_第33张图片

多线程并发编程笔记04(小滴课堂)---锁_第34张图片

 多线程并发编程笔记04(小滴课堂)---锁_第35张图片

 我们发现现在的输出就是符合实际的了。

多线程并发编程笔记04(小滴课堂)---锁_第36张图片

 多线程并发编程笔记04(小滴课堂)---锁_第37张图片

 多线程并发编程笔记04(小滴课堂)---锁_第38张图片

 

你可能感兴趣的:(多线程并发编程,java,开发语言,并发编程)