Java线程知识点一

线程安全产生的最终缘由

多个线程访问同一个变量的时候会产生java

线性安全定义

一个对象被多个线程访问时是否安全. 多个线性安全的方法组合起来并不安全。安全

锁的概念

可重入锁:同一个线程能够屡次得到这个锁 公平锁:获取锁的时候按照请求的顺序去得到。 非公平锁:获取锁的时候不是按照请求的顺序得到。jvm

synchronized

非公平锁,经过监视一个对象能够锁住代码块,或者直接加在方法前面。线程

静态方法:锁住当前Class对象。锁的范围静态方法的范围。。 非静态方法:锁住当前的这个对象。锁的范围只在当前对象。对象

ReentrantLock

把锁以对象的方式封装。 非公平锁: new ReentrantLock(),先检查队列是否空,若是不是直接获取,不然加到链表中 公平锁:new ReentrantLock(true),直接先去获取一下锁,若是获取不到则进入到一个链表中 ReentrantLock extends AbstractQueueSynchronizer(记录当前锁进入几回,status) extends AbstractOwnableSynchronizer(记录当前得到锁的对象)排序

ReentrantLock内部有FairLock和NonfairLock两个锁的实现队列

volatile

可见性

java线程工做的时候从主存里面读取数据到工做内存,在工做内存完成操做以后再写入到主存里。volatile可使得线程每次从主存里面读取,一个操做以后就强制写回到主存中。内存

禁止指令冲排序

Object a = new Object(); 在jvm里面是分为三步来作的:it

  1. 分配内存空间
  2. 建立对象
  3. 把内存地址值分配给引用 jvm会对没有依赖关系的语句进行重排序,执行的顺序多是123,也有多是132。这种指令重排序会引发线性安全的问题,先检查后操做的。

线性安全的集合:

Map

Hashtable 每一个方法加上synchronized ConcurrentHashMap 经过分段的方式减小锁的干预范围 Collections.synchronizedMap() 把Map包了一层,每隔方法加了synchronized再调用Map本身的方法io

List

Vector Collections.synchronizedList() 把List包了一层,每一个方法加了synchronized再调用List本身的方法

BlackingQueue

LinkedBlockingQueue 链表 PrioriryBlockingQueue 有优先级的blockingqueue,先取出优先级高的对象 ArrayListBlackingQueue 内部利用ReentrantLock以及Condition实现。 Condition.signal Condition.await

put(); 阻塞 take(); 阻塞

add() 满了抛出异常 offer() 满了返回false

poll 删除并返回第一个 peek 直接返回第一个

相关文章
相关标签/搜索