
Javab并发编程
文章平均质量分 76
javazcw
这个作者很懒,什么都没留下…
展开
-
Java并发编程-线程
1.线程的状态线程有一下一些状态,init,ready-to-run,Running,Sleeping,Waiting,Blocked和Dead,并在一些事件的触发下在这些状态之间进行转移,状态转移如下图:2.线程的创建 (1)继承Thread类 public class Demo1 extends Thread { public void run() { Syste...原创 2018-04-03 08:55:24 · 128 阅读 · 0 评论 -
Java并发编程-CopyOnWriteArrayList原理
1.CopyOnWriteArrayList是一个ArrayList线程安全的变体,它的所有改变底层数组的方法如(add,set等)通过复制底层数组来实现。这原本很消耗性能,但当遍历操作远远多于修改操作时,可能会比其他方法更高效,当你不想同步遍历操作时这种实现可能会有用。你需要排除并发线程之间的冲突。快照形式的迭代方法在得迭代器创建时使用一个数组状态的引用。这个数组在迭代器的生命周期内绝不会改变,...原创 2018-08-21 15:51:47 · 197 阅读 · 0 评论 -
Java并发编程-ForkJoin框架
1.ForkJoin框架是一个为了发挥多核CPU优势,充分利用CPU资源的一个任务并行执行框架,它可以将一个大任务拆分成若干个子任务,然后再由子任务合并最终得到执行结果。2.示例代码public class Demo extends RecursiveTask<Integer> { private int begin; private int end; ...原创 2018-08-07 09:02:10 · 170 阅读 · 0 评论 -
Java并发编程-Future提前完成任务
1.Jdk自带Future模式类图: 从类图中可以看出,RunnableFuture接口继承了Future和Runnable接口,而FutureTask类实现了RunnableFuture接口。所以FutureTask具有Future和Runnable的所有特性。Future还关联一个Callable的实例,来定义具体的计算过程,返回计算结果。 一个Futu...原创 2018-08-05 09:39:42 · 361 阅读 · 0 评论 -
Java并发编程-ThreadLocal线程局部变量的使用和原理
1.什么是ThreadLocal ThreadLocal顾名思义是线程局部变量。这种变量和普通的变量不同,这种变量在每个线程中通过get和set方法访问, 每个线程有自己独立的变量副本。线程局部变量不存在多个线程同时对同一个变量的操作,所以不会有线程安全问题。2.ThreadLocal变量的使用public class ThreadLocalDemo { priva...原创 2018-07-21 17:01:26 · 262 阅读 · 0 评论 -
Java并发编程-同步工具类
1.CountDownLatch 一个同步器辅助类允许一个或多个线程等待直到其他线程的一系列操作结束。一个CountDownLatch初始化时需要给定一个计数值。await方法阻塞直到当前计数值由于countDown方法的调用减为0,在此之后,所有等待的线程被释放,并且随后await的调用立即返回。这是一次性的,计数值不能重置。如果你需要重置计数值,考虑使用CyclicBarri...原创 2018-07-29 11:21:39 · 442 阅读 · 0 评论 -
Java并发编程-Condition的使用
1.Condition的使用Condition用于实现条件锁,可以唤醒指定的阻塞线程。下面来实现一个多线程顺序打印a,b,c的例子。先来看用wait和notify的实现:public class Demo { private volatile int singal; public synchronized void a() { while (singal != 0) { ...原创 2018-07-13 08:54:35 · 213 阅读 · 0 评论 -
Java并发编程-简易数据库连接池
1.模拟实现一个简易的数据库连接池。public class MyDataSource { private static LinkedList<Connection> pool = new LinkedList<>(); private static final int INIT_CONNECTIONS = 10; private stat...原创 2018-07-18 08:50:27 · 230 阅读 · 0 评论 -
Java并发编程-线程通信wait&notify&join
1.wait和notifywait和notify可以实现线程之间的通信,当一个线程执行不满足条件时可以调用wait方法将线程置为等待状态,当另一个线程执行到等待线程可以执行的条件时,调用notify可以唤醒等待的线程。需要强调的是,在调用wait和notify时需要先获取锁,否则会抛出IllegalMonitorException异常。notify方法随机从等待的线程中唤醒一个线程执行,not...原创 2018-07-10 08:08:55 · 444 阅读 · 0 评论 -
Java并发编程-读写锁
1.认识读写锁读写锁既是一个排他锁也是一个共享锁,读锁是共享锁,写锁是排他锁。读操作可以共存,读操作和写操作互斥,写操作和写操作之间互斥。下面是一个使用例子:public class Demo { private Map<String, Object> map = new HashMap<>(); private ReadWriteLock readWriteL...原创 2018-07-02 08:42:19 · 178 阅读 · 0 评论 -
Java并发编程-自己实现一个公平锁
1.公平锁的公平性是依赖等待队列实现的,当一个线程释放锁后,会唤醒等待队列中的第一个线程。public class FairLock { private boolean isLocked = false; private Thread lockingThread = null; // 等待队列 private List<QueueObject> waitingT...原创 2018-06-20 08:54:24 · 326 阅读 · 0 评论 -
Java并发编程-借助AQS实现一个简单的可重入锁
1.JDK自带的AbstractQueuedSynchronized同步器类为我们实现锁等其他一些同步组件提供了一个框架,它帮我们维护了一个代表锁状态的int值和一个线程等待队列,我们可以借助它来实现自己的锁。下面是一个例子:import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.AbstractQueuedSy...原创 2018-06-14 22:09:35 · 240 阅读 · 0 评论 -
Java并发编程-深入理解volatile关键字
1.volatile称之为轻量级锁,被它修饰的变量,在线程之间是可见的。所谓可见是指一个线程修改了这个变量的值,在另外一个线程中能够读到这个修改后的值。public class VolatileTest { public boolean run = false; public static void main(String[] args) { final Volatile...原创 2018-05-31 14:36:00 · 251 阅读 · 0 评论 -
Java并发编程-Lock接口的认识和使用
1.Lock是一个接口,定义了一系列的获取和释放锁的方法。接口 备注lock()获取锁,获取不到则阻塞tryLock()尝试获取锁,如果获取不到立即返回tryLock(long time, TimeUnit unit)在指定时间内尝试获取锁,如果获取不到立即返回lockInterruptedly()获取锁时可以响应中断2.Lock和synchronized的比较Lock需要显示地获取和释放锁,繁琐...原创 2018-06-06 08:49:30 · 168 阅读 · 0 评论 -
Java并发编程-单例模式与线程安全性问题
1.饿汉模式public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance() { return instance; }}这种单例模式在类初始化的时候就会实例化,不管是否...原创 2018-05-23 23:11:15 · 191 阅读 · 0 评论 -
Java并发编程-锁重入,自旋锁,死锁
1.锁重入 如果有两个被synchronized修饰的方法,其中在一个方法中调用了另一个方法,则执行这个方法的线程在第一次获取到锁之后,再调用另一个方法时不用再获取锁,这个过程叫锁重入,能够被重入的锁称为可重入锁。public class Demo { public synchronized void a() { System.out.println("a"); b(); } public s...原创 2018-05-23 20:10:58 · 332 阅读 · 0 评论 -
Java并发编程-并发带来的风险
1.安全性问题并发带来的安全性问题是指在多线程环境下代码的执行结果和单线程的结果不一致的问题。下面来看一个例子:public class Sequence { private int value; public int getNext() { return value++; } public static void main(String[] args) { ...原创 2018-05-21 22:24:36 · 281 阅读 · 0 评论 -
Java并发编程-线程池
1.线程池概述 什么是线程池? 为什么使用线程池即线程池的优势? (1)降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 (2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 (3)提高线程的可管理性,线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控...原创 2018-09-07 15:48:56 · 158 阅读 · 0 评论