首页
学习
活动
专区
圈层
工具
发布
20 篇文章
1
Java多线程编程-(20)-借ThreadLocal出现OOM内存溢出问题再谈弱引用WeakReference
2
Java多线程编程-(19)-多线程异步调用之Future模式
3
Java多线程编程-(18)-等待/通知模式接口Condition接口深入分析
4
Java多线程编程-(17)-读写锁ReentrantReadWriteLock深入分析
5
Java多线程编程-(16)-无锁CAS操作以及Java中Atomic并发包的“18罗汉”
6
Java多线程编程-(15)- 关于锁优化的几点建议
7
Java多线程编程-(14)-Java中的队列同步器AQS和ReentrantLock锁原理简要分析
8
Java多线程编程-(13)-从volatile和synchronized的底层实现原理看Java虚拟机对锁优化所做的努力
9
Java多线程编程-(12)-单例模式几种写法的错与对
10
Java多线程编程-(11)-面试常客ThreadLocal出现OOM内存溢出的场景和原理分析
11
Java多线程编程-(10)-看了这篇关于ThreadLocal的原理应该透彻了
12
Java多线程编程-(9)-使用线程池实现线程的复用和一些坑的避免
13
Java多线程编程-(8)-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier
14
Java多线程编程-(7)-使用ReentrantReadWriteLock实现Lock并发
15
Java多线程编程-(6)-你还在使用wait/notify实现进程间的通信吗?
16
Java多线程编程-(5)-线程间通信机制的介绍与使用(温馨提示:图文较多,建议Wiff下打开)
17
Java多线程编程-(4)-线程本地ThreadLocal的介绍与使用
18
Java多线程编程-(3)-从一个错误的双重校验锁代码谈一下volatile关键字
19
Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性
20
Java多线程编程-(1)-线程安全和锁Synchronized概念

Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性

上一篇:

Java多线程编程-(1)-线程安全和锁Synchronized概念

基本介绍了进程和线程的区别、实现多线程的两种方式、线程安全的概念以及如何使用Synchronized实现线程安全,下边介绍一下关于Synchronized的其他基本特性。

1

Synchronized锁重入

(1)关键字Synchronized拥有锁重入的功能,也就是在使用Synchronized的时候,当一个线程得到一个对象的锁后,在该锁里执行代码的时候可以再次请求该对象的锁时可以再次得到该对象的锁。

(2)也就是说,当线程请求一个由其它线程持有的对象锁时,该线程会阻塞,而当线程请求由自己持有的对象锁时,如果该锁是重入锁,请求就会成功,否则阻塞。

(3)一个简单的例子就是:在一个Synchronized修饰的方法或代码块的内部调用本类的其他Synchronized修饰的方法或代码块时,是永远可以得到锁的,示例代码A如下:

执行结果:

示例代码A向我们演示了,如何在一个已经被synchronized关键字修饰过的方法再去调用对象中其他被synchronized修饰的方法。

(4)那么,为什么要引入可重入锁这种机制哪?

我们上一篇文章中介绍了一个“对象一把锁,多个对象多把锁”,可重入锁的概念就是:自己可以获取自己的内部锁

假如有1个线程T获得了对象A的锁,那么该线程T如果在未释放前再次请求该对象的锁时,如果没有可重入锁的机制,是不会获取到锁的,这样的话就会出现死锁的情况。

就如代码A体现的那样,线程T在执行到method1()内部的时候,由于该线程已经获取了该对象syncDubbo 的对象锁,当执行到调用method2() 的时候,会再次请求该对象的对象锁,如果没有可重入锁机制的话,由于该线程T还未释放在刚进入method1() 时获取的对象锁,当执行到调用method2() 的时候,就会出现死锁。

(5)那么可重入锁到底有什么用哪?

正如上述代码A和(4)中解释那样,最大的作用是避免死锁。假如有一个场景:用户名和密码保存在本地txt文件中,则登录验证方法和更新密码方法都应该被加synchronized,那么当更新密码的时候需要验证密码的合法性,所以需要调用验证方法,此时是可以调用的。

(6)关于可重入锁的实现原理,是一个大论题,在这里篇幅有限不再学习,有兴趣可以移步至:http://www.cnblogs.com/pureEve/p/6421273.html 进行学习。

(7)可重入锁的其他特性:父子可继承性

可重入锁支持在父子类继承的环境中,示例代码如下:

2

Synchronized的其他特性

(1)出现异常时,锁自动释放

就是说,当一个线程执行的代码出现异常的时候,其所持有的锁会自动释放,示例如下:

执行结果如下:

可以看出,当执行代码报错的时候,程序不会再执行,即释放了锁。

(2)将任意对象作为监视器

执行结果:

(3)单利模式-双重校验锁:

单例模式中有一个经典的实现就是:双重校验锁,其中就是用到了synchronized,实现代码如下:

下一篇
举报
领券