Java操作系统硬件的方法Unsafe
Java中通过Unsafe类native方法,通过JNI绕过JVM来操作系统cpu、内存等硬件,实现更高效率的操作,在Java基础类库和第三方开源库中都有广泛的应用,比如JUC、Netty、Kafka等。通过Unsafe你可以自己内存管理、实例化对象、操作类、对象、变量、数组,可以实现多线程同步的基础、内存屏障等。Java9中移动了Unsafe类包并增加了大量的注释,对它又放开了些。
Java并发实现线程阻塞原语LockSupport
LockSupport工具类通过静态方法提供了多线程间阻塞唤醒原语,和CAS操作一样是JUC锁的基础,它的原理是通过类似信号量的permit【值为0或1】控制线程是否阻塞,调用unpack将其值设置为1,调用pack方法时消费permit,若本身permit已为0则阻塞当前线程。它与原来Ojbect的wait、notify方法阻塞线程的好处时,不用像或者一样必须在同步块中,并且可以先在某些特殊情况下即使先执行了unpack再park也不会导致线程意外阻塞。
JUC包中的锁框架
JUC包中的锁,包括:Lock接口,ReadWriteLock接口,LockSupport阻塞原语,Condition条件,AbstractOwnableSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer三个抽象类,ReentrantLock独占锁,ReentrantReadWriteLock读写锁。由于CountDownLatch,CyclicBarrier和Semaphore也是通过AQS来实现的。
线程中断总结
线程中断是开发者为了响应用户取消任务的请求让线程安全退出的一种推荐做法。它通过一个中断标记来让线程知道是否有其它线程请求让它中断,然后开发者让线程在合适的时候让自己退出。即不会造成不能停止线程导致的用户不能取消任务问题,也不会因为强行停止任务而导致数据不一致等问题。