Runable接口和Thread类区别

继承Thread类:

子类继承Thread类具备多线程能力
启动线程:子类对象. start()
不建议使用:避免OOP单继承局限性

实现Runnable接口:

实现接口Runnable具有多线程能力
启动线程:传入目标对象+Thread对象.start()
推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用

Sleep不会强制释放锁!

线程礼让:
礼让线程,让当前正在执行的线程暂停,但不阻塞
将线程从运行状态变成就绪状态
让cpu调度,礼让不一定成功!!! 看CPU心情

线程优先级不能决定线程的先后顺序,只是执行的概率变大了
优先级越大概率越高

Synchronized同步方法 ,默认锁的是this
同步块Synchronized,锁的对象是变化的量,需要增删改的那个量

通过ReentrantLock类实现Lock锁
Lock只能锁代码块,Synchronized可以锁方法和代码块
使用Lock锁,JVM将花费较少的时间来调度线程,性能更好,并且具有更好的扩展性(提供更多子类)

死锁:
1.互斥条件:一个资源每次只能被一个进程使用
2.请求和保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
3.不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺
4.循环等待条件:若干进程之间形成一种头尾相接的循坏等待资源关系

只要想办法破坏其中一个或者多个条件就能避免死锁

上一篇:Java的类可以同时继承thread和实现runable


下一篇:多线程详解(一)