随笔分类 - 多线程
摘要:LockSupport是一个线程阻塞工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,当然阻塞之后肯定得有唤醒的方法。主要有两类方法:park和unpark。 为什么叫park呢,park英文意思为停车。我们如果把Thread看成一辆车的话,park就是让车停下,unpark就是让车启动然后
阅读全文
摘要:在并发编程中,有时候需要使用线程安全的队列,如果要实现一个线程安全的队列有两种实现方式:阻塞算法、非阻塞算法。 使用阻塞算法的队列可以用一个锁(出入队列用同一把锁),或两个锁(入队和出队用不同的锁),非阻塞的实现方式则可以用循环CAS的方式实现。 一 非阻塞方式实现线程安全的队列 Concurren
阅读全文
摘要:Executor框架的主要成员:ThreadPoolExecutor、ScheduledThreadPoolExecutor、Future接口、runnable接口、Callable接口和Executors。 ThreadPoolExecutor 通常使用工厂类executors来创建。execut
阅读全文
摘要:ThreadLocal,即线程本地变量。如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地拷贝,多个线程操作这个变量的时候,实际是操作自己本地内存里面的变量,从而起到线程隔离的作用,避免了线程安全问题。 ThreadLocal内存结构图 当多个线程同时读写
阅读全文
摘要:future 模式 生产者-消费者模式 生产者-消费者模式是一个经典的多线程设计模式。它为多线程间的协作提供了良好的解决方案。 在生产者-消费者模式中,通常由两类线程,即若干个生产者线程和若干个消费者线程。生产者线 程负责提交用户请求,消费者线程则负责具体处理生产者提交的任务。生产者和消费者之间则通
阅读全文
摘要:临界区 – 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程 使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。 阻塞(Blocking)和非阻塞(Non-Blocking) – 阻塞和非阻塞通常用来形容多线程间的相互影响。阻塞,当一个线程
阅读全文
摘要:volatile是轻量级的synchronized,如果volatile变量修饰符使用恰当,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换(线程间的保存到再加载)和调度。 内存可见性多线程操作的时候,一个线程修改了一个变量的值 ,其他线程能立即看到修改后的值。防止重
阅读全文
摘要:CountDownLatch 倒数计数器 一个线程等待其他所有线程 一.CountDownLatch用法 CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用Coun
阅读全文
摘要:线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。 线程池的工作原理 先判断线程池中核心线程池所有的线程是否都在执行任务。如果不是,则新创建一个线程执行刚提交的任务,否则,核心线程池中所有的线程都在执行任务,则进入第2步; 判断
阅读全文
摘要:java.util.concurrent. locks包结构如下 Lock 在Lock接口出现之前,java程序主要是靠synchronized关键字实现锁功能的,而java SE5之后,并发包中增加了lock接口,它提供了与synchronized一样的锁功能。虽然它失去了像synchronize
阅读全文
摘要:java多线程相关类的实现都在Java的并发包concurrent,concurrent包主要包含3部分内容。 第一个是atomic包,里面主要是一些原子类,比如AtomicInteger、AtomicIntegerArray等; 第二个是locks包,里面主要是锁相关的类,比如ReentrantL
阅读全文
摘要:任务非常繁重系统执行不过来,系统负载到一定程度应该选择丢弃一些任务。 有以下几种拒绝策略: Abortpolicy 抛异常 CallerRunsPolicy 让调用者去执行 Discardpolicy 直接丢弃 DiscardoldestPolicy 丢弃队列种最老的任务
阅读全文
摘要:synchronized是Java原生提供的用于在多线程环境中保证同步的关键字,底层是通过修改对象头中的MarkWord来实现的。 synchronized锁住的Monitor对象就存在于对象头之中。对象头又分为:Mark Word、指向类的指针、数组长度(数组对象)。 对象头在Hotspot虚拟机
阅读全文
摘要:Lock 首先要说明的就是Lock,通过查看Lock的源码可知,Lock是一个接口: lock()、tryLock()、tryLock(long time, TimeUnit unit)和lockInterruptibly()是用来获取锁的。 unLock()方法是用来释放锁的。 lock() 首先
阅读全文
摘要:进程:进行资源分配和调度的一个独立单位。 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 Java线程的6种状态 由源码可知线程的生命周期大体可以分为6种状态:New:线程创建好,还没调start()方法。Runnable:调用start方法后进入此状态,它
阅读全文
摘要:公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁 公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁。 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优
阅读全文