摘要:
在JDK的并发包(java.util.concurrent下)中给开发者提供了几个非常有用的并发工具类,让用户不需要再去关心如何在并发场景下写出同时兼顾线程安全性与高效率的代码。 本文分别介绍CountDownLatch、CyclicBarrier和Semaphore这三个工具类在不同场景下的简单使 阅读全文
摘要:
线程池 线程池的优点 我们知道线程的创建和上下文的切换也是需要消耗CPU资源的,所以在多线程任务下,使用线程池的优点就有: 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 第三:提高线程的可管理性 阅读全文
摘要:
队列(Queue),是一种数据结构。除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的。 BlockingQueue 而阻塞队列BlockingQueue除了继承队列的所有方法外,还分别新增了支持阻塞的插入(put)和移除(take)方法。 下面我们分别看下JD 阅读全文
摘要:
真实的多线程业务开发中,最常用到的逻辑就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务), 这样做虽然保证了实例变量的线程安全性,但效率却是非常低下的。所以在JDK中提供了一种读写锁ReentrantReadWriteLock类, 阅读全文
摘要:
下面看下JUC包下的一大并发神器ReentrantLock,是一个可重入的互斥锁,具有比synchronized更为强大的功能。 ReentrantLock基本用法 先来看一下ReentrantLock的简单用法 public class MyDomain1 { private Lock lock 阅读全文
摘要:
在多线程系统中,彼此之间的通信协作非常重要,下面来聊聊线程间通信的几种方式。 wait/notify 想像一个场景,A、B两个线程操作一个共享List对象,A对List进行add操作,B线程等待List的size=500时就打印记录日志,这要怎么处理呢? 一个办法就是,B线程while (true) 阅读全文
摘要:
上文说到了 synchronized,那么就不得不说下 volatile关键字了,它们两者经常协同处理多线程的安全问题。 volatile保证可见性 那么volatile的作用是什么呢? 在jvm运行时刻内存的分配中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈, 线程栈保存了线程运 阅读全文
摘要:
线程安全 多个线程共同访问一个对象的实例变量,那么就可能出现线程不安全的问题。 先看一段代码示例,定义一个对象 MyDomain1 public class MyDomain1 { private int num = 0; public void addI(String username) { tr 阅读全文
摘要:
静态方法: Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程"。 为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程进行操作。下面来看一下Thread类中的静态方法: 1:currentThread /** * Returns a reference 阅读全文
摘要:
进程和线程 说到多线程,不妨先谈一谈进程的概念。在百度百科中对进程的解释如下: 其实简单理解程序的实体,就是我们操作系统运行的一个基本单元 比如我们系统运行着的微信这个聊天软件,就可以理解为一个进程。 那么线程又是什么呢? 线程可以理解为进程中独立运行的子任务就是一个线程,比如好友视频线程、下载文件 阅读全文