理解 Jdk volatile应用和实现原理

Java 多线程并发编程中,常用到两个关键字:synchronizedvolatile,synchronized 是重量级锁,而 volatile 可以理解为轻量级的 synchronized 。volatile 不保证对共享变量的读改写(如 i++)具有原子性,因此不能笼统说它“保证线程安全”;但在简单的 flag 开关、状态发布等场景下,用它做正确同步是可以的。

volatile 在并发环境中保证了共享变量的 可见性,即当一个线程修改一个共享变量时,另一个线程能读到这个修改的值。volatile 变量修饰符使用适当的话,相对于 synchronized 的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。

阅读更多

理解多线程和线程切换

多线程同时执行可以充分利用 CPU 的多核多线程功能来显著提高应用程序的性能,在多核环境中表现的更加明显(目前市面主流 CPU都是几乎都是多核多线程),即使单核 CPU 也支持多线程。

线程是操作系统调度的最小单元,CPU 通过给每个线程分配 CPU 时间片来实现多线程执行,时间片非常短(一般几十毫秒),通过不停切换线程来执行,给人的感觉是同时执行的。

阅读更多

Java Executor框架详解与应用

Java 的线程即是工作单元,也是执行机制。从 JDK 5 开始,把工作单元与执行机制分离开来。工作单元包括 RunnableCallable,而执行机制由 Executor 框架提供。

Executor 提供了一种将任务提交与每个任务如何运行的机制分离的方法(包括线程使用,调度的详细信息)。

阅读更多

线程池 ThreadPoolExecutor 详解与应用

Java 应用中对宝贵的稀缺资源池化是保障系统稳定运行,优化系统响应速度的重要手段。

线程池的运用场景非常广,几乎所有需要异步或并发执行任务的程序都可以使用线程池。

阅读更多

线程异常处理及异常传递

可以给线程指定异常处理类来捕获异常进行自定义处理。

线程中的异常可通过线程组异常处理来实现异常传递,线程组 ThreadGroup 实现了 Thread.UncaughtExceptionHandler 接口。

阅读更多

理解 Jdk Lock 的使用

JDK 1.5 新增了 ReentrantLock 类,可以实现线程之间的同步互斥,相比 synchronized ,在扩展功能上更加强大,在使用上更加灵活。

ReentrantLock 还具有嗅探锁定、多路分支通知等功能。

阅读更多

线程间通信-wait/notify/join/ThreadLocal/线程状态

  在将某一任务拆份成多个子任务,使用多线程执行这些子任,就涉及到线程通信,才能使用多子任变成一个整体。

  线程间通信后,系统之间的交互性会更强大,在提高 CPU 利用率时还有助于对各线程任务的把控和监督。

阅读更多

理解 synchronized 同步锁的使用

非线程安全 是在多个线程对同一个对象中的实例变量进行并发访问,读取的数据不一致,即数据被意外修改过,出现了脏读。线程安全通常需要同时关注 原子性、可见性、有序性

synchronized 是 Java 中的关键字,是一种同步锁,可以修饰方法、代码块、静态方法、类,使多线程以排队方式进行同步处理。

阅读更多

理解 Thread 线程类的方法

  JDK 自带的线程类实现了 Runnable 接口,提供了很多方法来支持对线程的操作,可以获取线程ID,线程名,判断线程是否存活等。

阅读更多