volatile:在多处理器的开发中保证了共享变量的“可见性”。一个线程改了一个变量,别的线程能马上读取到改之后的值。
synchonized:
对于普通同步方法,锁是当前实例对象。
对于静态同步方法,锁是当前类的Class对象。
对于同步代码块,锁是括号里的对象。
六、Java并发容器和框架
1、ConcurrentHashMap:线程安全且高效的HashMap
HashMap在并发执行put操作时会引起死循环。
HashTable使用synchonized来保证线程安全,效率低。
2、ConcurrentLinkedQueue:线程安全的队列
非阻塞队列。
3、BlockingQueue:阻塞队列
有界队列,元素满时,想放入元素会阻塞;元素空时,想取出元素也会阻塞。
实现有:
ArrayBlockingQueue:数组实现的有界阻塞队列
LinkedBlockingQueue:链表实现的有界阻塞队列
ProirityBlockingQueue:支持优先级排序的无界阻塞队列
等共7个
4、Fork、Join框架
Fork就是把一个大任务分为若干子任务并行执行;
Join就是合并这些子任务的执行结果。
八、Java中的并发工具类
1、CountDownLatch:允许等待其他线程完成操作
核心方法:
CountDownLatch(int) 计数器初始值
countDown( )计数器减一
await( ) 等待计数器为0,才往下执行
2、CyclicBarrier:同步屏障
让一组线程到达一个屏障时被阻塞;直到最后一个线程到达屏障时,屏障才会开门,所有被拦截的线程才会继续运行。
核心方法:
CyclicBarrier(int, Runnable),参数1表示屏障开门的线程数要求;参数2为屏障开门时先执行的线程,之后才执行被拦截的线程。
await( ),拦截线程,等待屏障开门
3、Semaphore:信号量
Semaphore用来控制同时访问特定资源的线程数量。
核心方法:
Semaphore(int),参数为资源数
acquire( ),请求资源,没获取到资源时,线程阻塞。
release( ),释放资源
4、Exchanger:线程间交换数据
它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。
核心方法:
exchange(T)
如果两个线程有一个没有执行exchange(T)方法,则会一直等待。有重载的方法,能够设置超时时间。
十、Executor
FixedThreadPool:固定线程数的线程池
SingleThreadExecutor:单线程数的线程池
CachedThreadPool:根据需要创建新线程的线程池
ScheduledThreadPoolExecutor:周期执行各种任务
Future接口表示异步计算的结果。FutureTask除了实现Future接口外,还实现了Runnable接口。因此,FutureTask可以交给Executor执行。







网友评论