偏向锁
?????? 当一个线程访问同步快并获取锁时,会在对象头和栈帧中的锁记录存储偏向的线程id,以后此线程在进入和退出同步快时不需要花费CAS操作来加锁解锁,只需要测试一下对象头里是否存储着指向当前线程的偏向锁。
轻量级锁
?????? 轻量级锁认为竞争存在,但是竞争的程度很轻,一般两个线程对于同一个锁的操作都会错开,或者说稍微等待一下(自旋),另一个线程就会释放锁。
?????? 但是当自旋超过一定的次数,或者一个线程在持有锁,一个在自旋,又有第三个来访时,轻量级锁膨胀为重量级锁,重量级锁使除了拥有锁的线程以外的线程都阻塞,防止CPU空转。
死锁、活锁、饥饿
死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
死锁的条件:
?????? 1、线程对资源访问互斥
?????? 2、线程访问资源后保持
?????? 3、线程获得资源不能被其他线程剥夺
?????? 4、环路等待条件 {p0,p1,p2,...pn},进程p0(或线程)等待p1占用的资源,p1等待p2占用的资源,pn等待p0占用的资源。
任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。
饥饿:是指如果线程T1占用了资源R,线程T2又请求封锁R,于是T2等待。T3也请求资源R,当T1释放了R上的封锁后,系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,
?????? 当T3释放了R上的封锁之后,系统又批准了T4的请求......,T2可能永远等待。
如何避免死锁:
?????? 加锁顺序(线程按照一定的顺序加锁)
?????? 加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
?????? 死锁检测
解决协同活锁的一种方案是调整重试机制。比如引入一些随机性。例如如果检测到冲突,那么就暂停随机的一定时间进行重试。这回大大减少碰撞的可能性。
活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。
Executors 类提供工厂方法用来创建不同类型的线程池。比如: newSingleThreadExecutor() 创建一个只有一个线程的线程池,newFixedThreadPool(int numOfThreads)来创建固定线程数的线程池,newCachedThreadPool()可以根据需要创建新的线程,但如果已有线程是空闲的会重用已有线程。
Executor则是一个接口?? 提供execute()方法用来提交任务 实现了这个接口的ExecutorService提供了submit()和execute()
UnsupportedOperationException
???? 使用了Java中未实现的方法抛出的异常
异常链
?????? 异常链”是Java中非常流行的异常处理概念,是指在进行一个异常处理时抛出了另外一个异常,由此产生了一个异常链条。
JDBC过程
?????? 1、Class.forName("com.mysql.jdbc.Driver");//加载驱动
?????? 2、Connection conn = DriverManager.getConnection(url,username,password);//获取连接
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-87102-10.html
埋怨命苦真悲哀
自己也这么说