Java中的Unsafe类提供了执行低级别、不安全操作的方法,如内存操作、CAS操作、类相关操作、对象操作、线程调度、系统信息获取、内存屏障、数组操作等。它还提供了原子操作和线程调度相关的方法,以及确保变量可见性的方法。
本文是《深入理解java虚拟机》第二版中关于java内存模型的描述。JMM规定了线程共享变量的读写规则,使用主内存和工作内存进行数据交互。可见性和指令重排序可以通过volatile、synchronized和final来保证。线程安全可以通过互斥同步和非阻塞同步来实现。创建线程的方式有继承Thread类、实现Runnable接口、实现Callable接口和使用线程池。ThreadLocal用于存储线程私有变量。AQS是JUC的基础,ReentrantLock和ReentrantReadWriteLock都是基于AQS实现的。StampedLock增加了乐观读锁。
简介LockSupport 是 Java 并发工具包
LockSupport是Java并发工具包中的基本线程阻塞原语,用于创建锁和其他同步类。它提供了park()和unpark()方法来停止和恢复线程,比低级的wait/notify和notifyAll方法更易于使用,并且与高级同步工具更好地配合。LockSupport相比于Object.wait和Object.notify提供了更高级、更安全、更灵活的线程同步机制。
从1996年1月的JDK1.0版本开始,Java就建立了基本的线程模型,JDK5.0引入了Java内存模型和并发包,JDK6.0优化了synchronized,JDK7.0推出了Fork/Join框架,JDK8.0推出了CompletableFuture和Stream,JDK9.0改善了锁争用机制,JDK10推出了线程-局部管控,JDK15禁用和废弃偏向锁,JDK19支持虚拟线程,J.U.C提供了原子化对象、锁及工具套装、线程池、线程安全容器等,使Java的自动档时代到来,大大降低了程序员使用多线程的门槛。
本文介绍了J.U.C组件扩展的3种方式:FutureTask、Fork/Join框架和BlockingQueue,其中Fork/Join框架采用工作窃取算法,可以充分利用线程进行并行计算;BlockingQueue有4组不同的方法用于插入、移除以及对队列中的元素进行检查,主要用于生产者和消费者场景;实现类有ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue和SynchronousQueue。
JDK19发布的最大亮点是支持虚拟线程,ThreadLocal提供无锁的多线程共享线程不安全对象,Collections提供线程安全集合,JDK 5.0引入J.U.C,JDK 6.0优化synchronized,JDK 7.0提供Fork/Join框架,JDK 8.0提供CompletableFuture和Stream,它们的核心竞争力分别是任务编排和流式处理。
当你使用java实现一个线程同步的对象时,一定会包含一个问题:你该如何保证多个线程访问该对象时,正确地进行阻塞等待,正确地被唤醒?
完成下面两步后,将自动完成登录并继续当前操作。