up:: 线程池与停止线程池相关的五个方法

说明:

(1)声明:

● Java并发编程的内容,还是比较多的;其中会涉及到Java并发机制底层原理、Java内存模型、Java并发编程实现基础(多线程)、Java的锁Java并发容器和框架、Java并发工具类等等;

● 而,本篇博客仅仅粗略介绍了,其中的ReentrantLock和Condition;在没有系统的学习Java并发内容情况下,想要很好的理解ReentrantLock和Condition这两个,是不太现实的;

● 所以,本篇博客的内容,不太具有参考性;

1.ReentrantLock;

ReentrantLock是Java中一种常见的“锁”,可以“锁住”一部分资源,让这部分资源在只有获取锁之后才能被操作;这就保证了线程安全,否则的话,如果有多个线程操作该资源,那么这个数据就可能会出错;


1、ReentrantLock和synchronize有什么区别?

a. API层面:

synchronized是Java语言的关键字,它的锁机制是由jvm实现的,是原生语法层面上的互斥。synchronized既可以修饰方法,也可以修饰代码块。

ReentrantLock是JDK1.5之后,提供的API层面的互斥锁,需要在代码中调用lock()、unlock()等方法来完成。

b. 等待可中断

等待可中断是指当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情。例如现有两个线程Thread1,Thread2。假设Thread1获取了对象object的锁,Thread2将等待Thread1释放object的锁。

使用synchronized:如果Thread1不释放,Thread2将一直等待,不能被中断。synchronized也可以说是Java提供的原子性内置锁机制。内部锁扮演了互斥锁(mutual exclusion lock ,mutex)的角色,一个线程引用锁的时候,别的线程阻塞等待。

使用ReentrantLock:如果Thread1不释放,Thread2等待了很长时间以后,可以中断等待,转而去做别的事情。

c. synchronized的锁是非公平锁,ReentrantLock默认情况下也是非公平锁。

2、使用场合有什么区别?

synchronized和ReentrantLock的效率相差不多。如果没有特殊的场景,推荐使用synchronized,因为它使用起来比较简单,且不会造成死锁。当需要一些synchronized所没有的特性的时候,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票,这时可以使用ReentrantLock。

2.Condition;

Condition是ReentrantLock的内部的工具,可以实现“等待”、“唤醒”的效果,比较典型的应用场景就是当执行任务A的线程获取到锁后,但是还没达到运行条件,那么就进入“等待”,而执行任务B栋线程在完成之后,再去“唤醒”之前“等待”状态的线程;