java-thread
王新春
这个作者很懒,什么都没留下…
展开
-
异常与锁的释放(lock)
antLock;/** * 演示功能: * 当lock锁获得后如果发生异常,线程结束,但是 lock锁不会释放 * @author 新春.王 * */public class ThreadException extends Thread{ static Lock lock1 = new ReentrantLock(); static Lock lock2 = new ReentrantLock(); private static boolean fl原创 2013-02-16 22:57:11 · 939 阅读 · 0 评论 -
AQS-预备知识 CLH lock queue[摘抄]
原创 2017-05-18 20:07:50 · 196 阅读 · 0 评论 -
AQS-预备-FIFOMutex
rentLinkedQueue;import java.util.concurrent.atomic.AtomicBoolean;import java.util.concurrent.locks.LockSupport;public class FIFOMutex { private final AtomicBoolean locked = new AtomicBoolean(false); /** * 线程先进先出队列 */ private final Queue原创 2017-05-18 20:25:18 · 263 阅读 · 0 评论 -
Thread-wait/notify
WaitNotify { private static StringBuffer lock = new StringBuffer(); public static void main(String[] args) throws Exception { // testWaitAfterNotify(); //testWaitBeforeNotify(); testWaitAfterNotifyV2(); } /** * 先notify 后wait,不能正常工2017-05-19 11:59:05 · 137 阅读 · 0 评论 -
CountDownLatch/CyclicBarrier
续执行。 CountDownLatch维护一个状态 count值,这个值可以通过调用countDown 方法让它递减,直到为0在count为0之前,所有调用await的方法全部挂起。 内部实现:依赖于AbstractQueuedSynchronizer 框架,让调用await的方法的线程挂起park,直到countDown 操作,改变count的值,unpark 对应的线程。 应用场景:比如一个A服务,需要调用B,C两个服务 并merge他们的结果进行返回 1、A服务线程2017-05-19 20:59:37 · 87 阅读 · 0 评论 -
Synchronized&AbstractQueuedSynchronizer[摘抄]
队列容纳所有的阻塞线程,而对该队列的操作均通过Lock-Free(CAS)操作,但对已经获得锁的线程而言,ReentrantLock实现了偏向锁的功能。更本质上说:队列的这种方式是思想,底层还要依赖于LockSupport对线程的禁用(park)和许可(unpark)的逻辑 synchronized: 底层也是一个基于CAS操作的等待队列,但JVM实现的更精细,把等待队列分为ContentionList和EntryList,目的是为了降低线程的出列速度;当然也实现了偏向锁,从数据结构来原创 2017-05-19 21:29:28 · 206 阅读 · 0 评论 -
LockSupport
public native void unpark(Thread jthread); public native void park(boolean isAbsolute, long time); isAbsolute参数是指明时间是绝对的,还是相对的。 仅仅两个简单的接口,就为上层提供了强大的同步原语。先来解析下两个函数是做什么的。unpark函数为线程提供“许可(permit)”,线程调用park函数则等待“许可”。这个有点像信号量,但是这个“许可”是不能叠原创 2017-05-19 22:15:15 · 74 阅读 · 0 评论 -
AQS-预备-背景
一个线程可以操作资源,根据业务的需要,对应能够或者允许操作资源的线程可以得到继续执行,不能拿到资源的线程要进行等待(park),直到其他线程释放资源的时候,等待的线程可以尝试获取资源,拥有后可以继续执行。 为了记录没有拿到资源的线程,我们可以定义一个数据组或者一列表来记录,一旦有其他线程释放资源的时候,我们可以unpark这些(或者第一个)等待的线程。一种非常糙的仅仅为了说明这种效果的实现是:/** * @author xinchun.wang */ public stati2017-05-20 18:16:25 · 99 阅读 · 0 评论 -
Condition&(wait,notify)
原创 2017-05-22 10:58:02 · 129 阅读 · 0 评论 -
多个线程到达后才能执行某个任务,并且只能执行一次
2015-04-02 23:51:44 · 194 阅读 · 0 评论 -
ThreadLocal 在web环境下使用的边界问题
http请求,一般都有线程池对请求做处理。这种情况下要注意,并非每次web请求时候程序运行的ThreadLocal都是唯一的,ThreadLocal的生命周期不等于一次Request的生命周期,ThreadLocal与线程对象紧密绑定的,由于Tomcat使用了线程池,线程是可能存在复用情况,这时的ThreadLocal 的使用要谨慎使用。web请求下 的ThreadLocal 使用要保证:[b]请求进来的时候set,请求回去的时候remove。只有这样才能保证请求内的ThreadLocal2014-06-12 13:30:17 · 68 阅读 · 0 评论 -
异常与锁的释放(synchronized )
法抛出异常的时候会自动解锁 * @author 新春.王 * */public class SynchronizeException extends Thread{ private static volatile boolean flag = true; private A a; private B b; public static void main(String[] args) { A a = new A(); B b = new B(); new S原创 2013-02-16 23:28:55 · 338 阅读 · 0 评论 -
lock实现运行时死锁检测
原创 2013-02-24 23:02:40 · 171 阅读 · 0 评论 -
lock 锁class类对象和实例对象
原创 2013-02-25 23:18:09 · 573 阅读 · 0 评论 -
Thread的join方法
rent thread. The interrupted status of the current thread is cleared when this exception is thrown.翻译为中文:等待这个线程死亡即:在a线程中,调用b线程的join方法,a线程会同步直到b线程结束。即(表达形式可能不太科学):[code="java"] public void a(){ b.join(); // 继续执行需要b线程的run方法完成或者被原创 2013-02-25 23:44:36 · 90 阅读 · 0 评论 -
源码剖析之CyclicBarrier
2013-06-07 00:07:24 · 62 阅读 · 0 评论 -
源码剖析之ThreadLocal
问题。2、但是有时候又需要定义某些成员变量,来方便[b]多个方法间[/b]共享对象数据的访问。以避免在方法间传递大量的参数,ThreadLocal 就提供了这样的效果。解决问题1的方案:我们解决此问题的一个常用手段是加锁,然而加锁会造成程序伸缩性的降低,在高并发的激烈竞争锁资源,依然可能会成为性能的瓶颈。解决问题2的方案:jdk 1.2 开始提供的ThreadLocal 类,为此类问题提供了较好的解决方案,他实现了为每一个线程提供一个本地对象的功能,这样就保证了线程间不会有数据的共享,那原创 2013-06-08 12:57:53 · 64 阅读 · 0 评论 -
原码剖析之ThreadPoolExecutor入门
原创 2013-06-15 10:44:21 · 52 阅读 · 0 评论 -
原码剖析之ThreadPoolExecutor进阶
原创 2013-06-17 17:15:51 · 79 阅读 · 0 评论 -
Thread.isInterrupted 的理解
2017-05-24 21:01:35 · 391 阅读 · 0 评论