多线程
挑战不可能,努力
这个作者很懒,什么都没留下…
展开
-
线程五种状态及其相关方法,线程安全
注意:当调用wait(),当前线程会释放掉“锁标志”,所以线程只有在此获取资源才能进入就绪状态。当线程从就绪状态进入运行状态时,如果发现有锁,会进入锁池状态,而不是进入阻塞状态。1、新建状态(New):新创建了一个线程对象。2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使...转载 2018-09-30 22:02:53 · 309 阅读 · 0 评论 -
锁优化:偏向锁,轻量锁,重量锁(对象锁)自旋锁 锁粗化 锁消除 乐观锁和悲观锁的区别
jdk1.6对锁的实现引入了大量的优化,如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。 锁主要存在四中状态,依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,他们会随着竞争的激烈而逐渐升级。注意锁可以升级不可降级,这种策略是为了提高获得锁和释放锁的效率。每次设置锁,都需要操作系统的配合,需要操作系统在内核中维护一个Mutex(互斥量)的东西。这将带...转载 2018-10-01 00:19:43 · 733 阅读 · 0 评论 -
Lock、ReentrantLock(可重入锁,非公平锁(默认))ReadWriteLock(读共享锁,写独享锁)
public interface Lock { //尝试获取锁,获取成功则返回,否则阻塞当前线程void lock(); //尝试获取锁,线程在成功获取锁之前被中断,则放弃获取锁,抛出异常 void lockInterruptibly() throws InterruptedException; //尝试获取锁,获取锁成功则返回true,否则返回false boolean t...转载 2018-10-01 22:28:53 · 856 阅读 · 0 评论 -
AQS、CAS
AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列(虚拟的双向队列即不存在队列实例,仅...翻译 2018-10-07 18:09:43 · 745 阅读 · 0 评论 -
ThreadLocal简介、实现、使用步骤
线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾...转载 2018-10-01 23:55:04 · 105 阅读 · 0 评论 -
volatile,Lock、ReentrantLock、Theadlocal与synchronized的区别
volatile与synchronized1)volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.2)volatile仅能使用在变量级别,synchronized则可以使用在变量,方法.3)volatile仅能实现变量的修改可见性,而synchronized则可以保证变...原创 2018-10-01 23:55:28 · 375 阅读 · 0 评论 -
线程池实现原理(Executor框架),java提供常用的几种线程池、死锁产生条件和避免
为什么使用线程池服务器应用程序中经常出现的情况是:单个任务处理的时间很短而请求的数目却是巨大的。如果每个请求对应一个线程(thread-per-request)方法的不足之一是:为每个请求创建一个新线程的开销很大;为每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多。在一个 JVM 里创建太多的线程可能会导致系统由于过度消耗内存而...原创 2018-10-02 13:26:39 · 605 阅读 · 0 评论 -
Java 读写锁实现原理
为什么需要读写锁?与传统锁不同的是读写锁的规则是可以共享读,但只能一个写,总结起来为:读读不互斥,读写互斥,写写互斥,而一般的独占锁是:读读互斥,读写互斥,写写互斥,而场景中往往读远远大于写,读写锁就是为了这种优化而创建出来的一种机制。注意是读远远大于写,一般情况下独占锁的效率低来源于高并发下对临界区的激烈竞争导致线程上下文切换。因此当并发不是很高的情况下,读写锁由于需要额外维护读锁的状态...翻译 2018-10-07 18:45:45 · 166 阅读 · 0 评论 -
Exchanger两个线程交换数据
转载自:JUC之ExchangerJUC中的Exchanger允许成对的线程在指定的同步点上通过exchange方法来交换数据。如果第一个线程先执行exchange方法,它会一直等待第二个线程也 执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将当前线程生产 出来的数据传递给对方。Exchanger示例两个线程通过Exchanger交换数据的简单示例:...转载 2019-08-13 17:24:55 · 208 阅读 · 0 评论