JavaConcurrent
2017-03-03 17:23:30 0 举报
AI智能生成
JavaConcurrent是Java并发编程的重要工具,它提供了一组用于处理并发任务的类和接口。这些类包括线程池、同步器、信号量等,可以帮助开发者更加高效地编写并发代码。JavaConcurrent的主要目标是提高程序的性能和响应速度,通过充分利用多核处理器的能力来实现这一点。此外,JavaConcurrent还提供了一些高级特性,如非阻塞算法、异步执行等,使得开发者可以更加灵活地处理复杂的并发问题。总之,JavaConcurrent是Java程序员必备的工具之一,它可以帮助他们更好地理解并发编程的本质,并编写出高质量的并发代码。
作者其他创作
大纲/内容
并行模式与算法
单例模式
不变模式
一个对象一旦被创建,则内部状态永远不发生变化。
如:java.lang.String、java.lang.Long等
生产者-消费者模式
无锁的缓存框架:Disruptor
Future模式
异步调用
并行流水线
每个线程只负责自己的工作,类似于流水线作业
并行搜索
并行排序
如冒泡排序、希尔排序等
矩阵乘法
网络NIO
JDK并发包
同步控制
重入锁,java.util.concurrent.locks.ReentranLock,
可以替代synchronizde,功能类似,灵活性好一些
lock() :获得锁,如果占用,就等待
lockInterruptibly():获得锁,但优先中断响应
tryLock():尝试获得锁
tryLock(long time,TimeUnit unit):给定的时间内尝试获得锁
unlock():释放锁
Condition条件,和重入锁结合使用。
await() 线程会释放重入锁,signal()获得相关锁。
ReadWriteLock读写锁
读读之间不阻塞
读阻塞写,写也会阻塞读
写写阻塞
CountDownLatch倒计时器
CyclicBarrier循环栅栏
LocakSupport线程阻塞工具类,
在线程内任意位置让线程阻塞
线程池java.util.concurrent,使用线程池,
可以复用线程,避免频繁的创建和销毁
线程带来的资源的开销。
固定大小线程池Executors.newFixedThreadPool()
单个线程池newSingleThreadExecutor()
一个可以根据实际情况调整线程数据的线程池Executors.newSingleThreadScheduledExecutor()
指定的时间执行某项任务
Executors.newScheduledThreadPool()
扩展线程池ThreadPoolExecutor,
如监控线程的执行时间等
Fork/Join框架,类似于MapReduce分而治之的思路,
将大任务拆分成小任务,返回合并结果
并发容器
ConcurrentHashMap线程安全的HashMap
CopyOnWriteArrayList 适用于读多写少的场合
ConcurrentLinkedQueue 线程安全的LinkedList
BlockingQueue 阻塞队列,适用于数据共享通道
ConcurrentSkipListMap 跳表,是一个Map,
使用跳表的数据结构实现快速查找
JDK线程基础
线程新建
1、实现Runnalbe接口
2、继续Thread类
终止线程
不建议使用Thread.stop(),会导致数据不一致,
可以自定义一个退出方法,线程执行时,进行判断即可。
线程中断
Thread.interrupt() 中断线程
Thread.isTnterrupted ()判断是否中断。需要增加处理逻辑,例:判断线程是否中断,中断就退出程序等。
Thread.interrupted() 判断是否中断,并清除当前中断状态
等待、通知
当一个对象实例上调用了等待wait()后,当前线程就会停止执行,转为等待状态,当调用了这个对象的通知notify()后,才继续执行。notify()随机唤醒线程。notifyALL()是唤醒所有线程。需结合synchronzied语句一起使用。
挂起、继续执行
挂起suspend()、继续执行resume() 废弃方法,不建议使用。
等待结束、谦让
一个线程等待其他线程运行完,可以使用join()方法、谦让yield(),使线程让出CPU,当线程优先级不高,又担心会占用过多CPU资源,可以使用该方法。
volatile关键字
可以声明一个对象,保证操作的原子性,但无法保证一些复合操作的原子性。
线程组
ThreadGroup 将功能相同的线程,放在一个组里,方便管理。
守护线程
Daemon
线程优先级
可以用1到10来定义线程的优先级,setPriority(int)
synchronized关键字
线程安全,对同步的代码加锁,每一次,只能有一个线程可以进入到同步块中。例如:线程A在写入时,线程B不能进行读写。
锁的优化
使用锁的建议
1、减少锁的持有时间,如:只在必要时进行同步
2、减小锁的粒度,如:缩小锁定对象的范围
3、读写分离锁替换独占锁,适用于读多写少的场合
4、锁分离
5、锁粗化,如果对同一个锁不停的进行请求、同步和释放,会消耗过多资源,可以将多次锁的操作,合并成一次请求
ThreadLocal
线程容器,每个线程一个对象,只有当前线程可以访问容器内的数据
线程基本概念
同步、异步
同步Synchronous:方法调用,等待方法返回结果。
异步Asynchronous:方法调用,立即返回,通常会有另外一个线程去执行任务。
并发、并行
并发Concurrency:多个任务交替执行,多个任务之间有可能还是串行
并行Parallelism:多个任务同时执行
临界区
一种公共资源、共享数据,每一次,只能一个线程使用
阻塞、非阻塞(形容线程之间的相互影响)
阻塞Blocking:比如线程占用了临界区资源,其他要使用这个资源的线程,需要进行等待。
非阻塞Non-Blocking:线程之间没有相互阻碍
死锁、饥饿、活锁(线程的活跃问题)
死锁DeadLock:线程相互持有对方所需资源,且不释放
饥饿Starvation:无法获得所需资源,导致一直无法执行
活锁LiveLock:资源不断的在两个线程中跳动,但没有一个线程可以同时拿到所有资源而正常执行
0 条评论
下一页
为你推荐
查看更多