• 暂时停更一段时间!
  • 近期网站将陆续进行前端页面改造!
  • 招募网站编辑,联系站长!

标签:Java并发

Java并发(十三)多线程开发良好的实践

– 给线程起个有意义的名字,这样可以方便找 Bug。– 缩小同步范围,例如 对于 synchronized,应该尽量使用同步块而不是同步方法。– 多用同步类少用 wait 和 notify。首先,CountDownLatch, Semaphore, CyclicBarrier 和 Exchanger 这些同步类简化了编……

Java并发(十二)锁优化

高效并发是从 JDK 1.5 到 JDK 1.6 的一个重要改进,HotSpot 虚拟机开发团队在这个版本上花费了大量的精力去实现各种锁优化技术,如适应性自旋(Adaptive Spinning)、锁消除(Lock Elimination)、锁粗化(Lock Coarsening)、轻量级锁(Lightweight Locking)和偏向锁(Biased L……

Java并发(十一)线程安全

线程安全分类线程安全不是一个非真即假的命题,可以将共享数据按照安全程度的强弱顺序分成以下五类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。1. 不可变不可变(Immutable)的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何的线程安全保障措施,只要一个不可变的对象被正确地构建出来,那其外部的可见状态永远也不……

Java并发(十)Java内存模型

Java 内存模型视图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。主内存与工作内存处理器上的寄存器的读写的速度比内存快几个数量级,为了解决这种速度矛盾,在它们之间加入了高速缓存。加入高速缓存带来了一个新的问题:缓存一致性。如果多个缓存共享同一块主内存区域,那么多个缓存的数据可能会不一致。CPU ……

Java并发(九)线程不安全示例

如果多个线程对同一个共享数据进行访问而不采取同步操作的话,那么操作的结果是不一致的。以下代码演示了 1000 个线程同时对 cnt 执行自增操作,操作结束之后它的值为 997 而不是 1000。public class ThreadUnsafeExample { private int cnt = 0; public vo……

Java并发(八)J.U.C – 其它组件

FutureTask在介绍 Callable 时我们知道它可以有返回值,返回值通过 Future 进行封装。FutureTask 实现了 RunnableFuture 接口,该接口继承自 Runnable 和 Future 接口,这使得 FutureTask 既可以当做一个任务执行,也可以有返回值。public class FutureTask<……

Java并发(七)J.U.C – AQS

java.util.concurrent(J.U.C)大大提高了并发性能,AQS 被认为是 J.U.C 的核心。CountdownLatch用来控制一个线程等待多个线程。维护了一个计数器 cnt,每次调用 countDown() 方法会让计数器的值减 1,减到 0 的时候,那些因为调用 await() 方法而在等待的线程就会被唤醒。public……

Java并发(六)线程之间的协作

当多个线程可以一起工作去解决某个问题时,如果某些部分必须在其它部分之前完成,那么就需要对线程进行协调。join()在线程中调用另一个线程的 join() 方法,会将当前线程挂起,而不是忙等待,直到目标线程结束。对于以下代码,虽然 b 线程先启动,但是因为在 b 线程中调用了 a 线程的 join() 方法,因此 b 线程会等待 a 线程结束才继续执行,……

Java并发(五)互斥同步

Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现的 ReentrantLock。synchronized1. 同步一个代码块public void func () { synchronized (this) { // ... ……

Java并发(四)中断

一个线程执行完毕之后会自动结束,如果在运行过程中发生异常也会提前结束。InterruptedException通过调用一个线程的 interrupt() 来中断该线程,如果该线程处于阻塞、限期等待或者无限期等待状态,那么就会抛出 InterruptedException,从而提前结束该线程。但是不能中断 I/O 阻塞和 synchronized 锁阻塞。……

Java并发(三)基础线程机制

ExecutorExecutor 管理多个异步任务的执行,而无需程序员显示地管理线程的生命周期。主要有三种 Executor:1. CachedTreadPool:一个任务创建一个线程;2. FixedThreadPool:所有任务只能使用固定大小的线程;3. SingleThreadExecutor:相当于大小为 1 的 FixedThreadP……

Java并发(二)使用线程

有三种使用线程的方法:1. 实现 Runnable 接口;2. 实现 Callable 接口;3. 继承 Thread 类。实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需要通过 Thread 来调用。可以说任务是通过线程驱动从而执行的。实现 Runnable 接口需要实……

Java并发(一)线程状态转换

新建(New)创建后尚未启动。可运行(Runnable)可能正在运行,也可能正在等待 CPU 时间片。包含了操作系统线程状态中的 Running 和 Ready。阻塞(Blocking) 等待获取一个排它锁,如果其线程释放了锁就会结束此状态。无限期等待(Waiting) 等待其它线程显式地唤醒,否则不会被分配 CPU ……