Lock和Synchronized的区别
Lock实现了与synchronized相同的互斥性和内存可见性。
synchronized代码简单,并且与处理异常操作实现了很好的交互。 synchronized是可重入锁。
Lock提供了一种无条件的,可轮询的,定时的以及可中断的锁获取操作,所有加锁和释放锁都是显式的。
ReentrantLock实现了Lock接口,并提供了与synchronized相同的互斥性和内存可见性。 并且提供了可重入的加锁语义。它还为锁的不可用问题提供了更高的灵活性。
ReentrantLock提供了更好的活跃性,性能,公平性。
synchronized代码整洁简单
ReentrantLock必须在finally中释放。
ReentrantLock与AbstractQueuedSynchronizer http://www.importnew.com/24006.html
https://blog.csdn.net/yanyan19880509/article/details/52345422/
http://ifeve.com/introduce-abstractqueuedsynchronizer/
https://blog.csdn.net/tb3039450/article/details/69056169
AbstractQueuedSynchronizer
1:构建同步器类
2:管理同步器中的状态(基于状态的同步器)
3:维护一个资源队列,资源是线程。
AbstractQueuedSynchronizer 用来管理同步器的状态。可以用它构建同步器(ReentrantLock等)和其它同步框架。
AbstractQueuedSynchronizer给定一个状态,然后将其封装到锁的子类里面,可以为自定义锁设置一些自定义内容,比如最大访问线程数。
AQS维护的队列是当前等待资源的队列。
每个Condition维护着一个队列,该队列的作用是维护一个等待singal信号的队列。
semphore构建边界队列时,可以使用。
ExecutorService 异步框架。
创建线程池的两种方式:
1:根据线程工厂创建线程池,可以创建任意多的线程。
ThreadFactory threadFactory=Executors.defaultThreadFactory();
ExecutorService threadPoolExecutor = Executors.newCachedThreadPool(threadFactory);
2:指定线程池的大小
ExecutorService threadPoolExecutor = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors());