多个线程访问同一个变量的时候会产生java
一个对象被多个线程访问时是否安全. 多个线性安全的方法组合起来并不安全。安全
可重入锁:同一个线程能够屡次得到这个锁 公平锁:获取锁的时候按照请求的顺序去得到。 非公平锁:获取锁的时候不是按照请求的顺序得到。jvm
非公平锁,经过监视一个对象能够锁住代码块,或者直接加在方法前面。线程
静态方法:锁住当前Class对象。锁的范围静态方法的范围。。 非静态方法:锁住当前的这个对象。锁的范围只在当前对象。对象
把锁以对象的方式封装。 非公平锁: new ReentrantLock(),先检查队列是否空,若是不是直接获取,不然加到链表中 公平锁:new ReentrantLock(true),直接先去获取一下锁,若是获取不到则进入到一个链表中 ReentrantLock extends AbstractQueueSynchronizer(记录当前锁进入几回,status) extends AbstractOwnableSynchronizer(记录当前得到锁的对象)排序
ReentrantLock内部有FairLock和NonfairLock两个锁的实现队列
java线程工做的时候从主存里面读取数据到工做内存,在工做内存完成操做以后再写入到主存里。volatile可使得线程每次从主存里面读取,一个操做以后就强制写回到主存中。内存
Object a = new Object(); 在jvm里面是分为三步来作的:it
Hashtable 每一个方法加上synchronized ConcurrentHashMap 经过分段的方式减小锁的干预范围 Collections.synchronizedMap() 把Map包了一层,每隔方法加了synchronized再调用Map本身的方法io
Vector Collections.synchronizedList() 把List包了一层,每一个方法加了synchronized再调用List本身的方法
LinkedBlockingQueue 链表 PrioriryBlockingQueue 有优先级的blockingqueue,先取出优先级高的对象 ArrayListBlackingQueue 内部利用ReentrantLock以及Condition实现。 Condition.signal Condition.await
put(); 阻塞 take(); 阻塞
add() 满了抛出异常 offer() 满了返回false
poll 删除并返回第一个 peek 直接返回第一个