?????????????? 互斥量是阻塞锁,当某线程无法获取互斥量时,该线程会被直接挂起,该线程不再消耗CPU时间,当其他线程释放互斥量后,操作系统会激活那个被挂起的线程,让其投入运行。
?????????????? 如果加锁的代码经常被调用,但竞争情况很少发生时,应该优先考虑使用自旋锁,自旋锁的开销比较小,互斥量的开销较大。
?????????????? 如果是单核处理器,一般建议不要使用自旋锁。
?????? Ticket Lock
?????????????? 解决了普通自旋锁的公平性问题,锁有一个服务号,表示正在服务的线程。每个线程自己有一个排队号。分布式计算原理线程不断询问服务号是不是自己的排队号,不是就自旋轮询,否则推出自旋。
?????????????? 但是这个模式使得各个线程的缓存需要同步(访问同一个服务号),导致数据在缓存间同步开销很大,
?????? MCS锁
?????????????? 申请线程只在本地变量上自旋,直接前驱负责通知其结束自旋,减少了不必要的处理器缓存同步。
?????? CLH锁
?????????????? 申请线程只在本地变量上自旋,不断轮询前去的状态,发现前驱释放了锁就结束自旋。
?????? AQS中的CLH机制的等待机制从自旋变成了阻塞唤醒。但是JVM默认对锁进行自旋优化(混合锁)。
num&=(num-1)可以去掉num最低位的1,如果存在的话
ArithmeticException
LinkedHashMap 保证插入数据顺序的HashMap
BigDecimal的高精度特点 multiply和divide
public class LinkedList<E>
?????? extends AbstractSequentialList<E>
?????? implements List<E>, Deque<E>, Cloneable, java.io.Serializable
public class ArrayList<E> extends AbstractList<E>
?????????????? implements List<E>, RandomAccess, Cloneable, java.io.Serializable
IllegalThreadStateException
System.out.println()线程安全 但是如果在参数列表进行数据计算会出现线程安全问题
currentThread() isAlive()可以判断是否存活
Thread.sleep() 让this.currentThread()返回的线程沉睡
java中有以下3中方法可以终止正在运行的线程:
?????? 1、线程正常退出(run()方法结束)
?????? 2、使用stop()方法强行停止线程,但是stop、suspend、resume都过期了
?????? 3、interrupt方法中断线程
调用interrupt()方法不是马上中断,而是打了一个标记
静态方法Thread.interrupted()作用是测试当前线程是否发生中断 清除中断位
interrupt()作用是打断指定线程 置中断状态
isInterrupted()方法作用是判断是否是中断状态
利用中断位加return进行线程停止是很好的方法
stop()方法与java.lang.ThreadDeath异常
?????? stop()方法会抛出java.lang.ThreadDeath异常
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-87102-2.html
都是这样的状态
中国军民有权抗击美舰美军