多线程的对象锁

Posted IT编程之路

tags:

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

之前说过“线程安全”的一个重要的关键字synchronized,并且该关键字获取的锁为对象锁。用程序实现一下代码如下:

多线程的对象锁

多线程的对象锁

多线程的对象锁

多线程的对象锁

不加synchronized关键字的运行结果是不同步的,如何实现同步呢?我们只需要在Model.java类中的methodA方法前面加上synchronized关键字就可以代码如下:

多线程的对象锁

多线程的对象锁

通过上面的运行结果得出结论,调用用关键字synchronized声明的方法一定是排队运行的。另外需要记住“共享”这两个字,只有共享资源的读写访问才需要同步化,如果不是共享资源,就没有必要去同步了。

如果其他的方法被调用了会是什么结果呢,如何查看lock锁对象的效果呢?我们继续修改代码:

Model.java类

多线程的对象锁

自定义线程ThreadB.java类

多线程的对象锁

多线程的对象锁

运行结果来看虽然线程A持有了对象的锁,但线程B可以完全异步调用非synchronized类型的方法。

如果在Model.java类中methodB()方法上加synchronized关键字会是什么效果?继续修改代码如下:

多线程的对象锁

根据结果所得到的结论是:

1、线程A现持有model对象的lock锁,线程B可以以异步的方法调用model对象中的非synchronized类型的方法。

2、线程A先持有model对象的lock锁,线程B如果在这时调用model对象中的synchronized类型的方法则需要等待,也就是同步。


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

整数的无锁多线程

Python网络编程(进程通信信号线程锁多线程)

无锁多线程编程初步(基础部分)

《C++多线程编程》学习笔记

多线程加锁#yyds干货盘点#

iOS - 多线程的锁