多线程(Lock锁,死锁,等待唤醒机制,阻塞队列,线程池)
Lock锁
虽然我们可以理解同步代码块和同步方法的锁对象问题但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock Lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定操作Lock中提供了获得锁和释放锁的方法 void lock():获得锁void unlock():释放锁 即手动上锁、手动释放锁 Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来实例化ReentrantLock的构造方法 ReentrantLock():创建一个ReentrantLock的实例
例子:
package Threadmethod;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class MyThread1 extends Thread{
static int jicket=0;
static Lock lock=new ReentrantLock();
@Override
public void run() {
while (true){
lock.lock();
try {
if(jicket==100){
break;
}
else {
Thread.sleep(10);
jicket++;
System.out.println(getName()+ "正在卖第"+jicket+"张票");
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
lock.unlock();
}
}
}
}
测试类
package Threadmethod;
public class ThreadDemo8 {
public static void main(String[] args) {
MyThread1 t1=new MyThread1();
MyThread1 t2=new MyThread1();
MyThread1 t3=new MyThread1();
t1.setName("窗口一");
t2.setName("窗口二");
t3.setName("窗口三");
t1.start();
t2.start();
t3.start();
}
}
死锁
死锁是指在多个进程或线程中,每个进程或线程因为等待另一个进程或线程所拥有的资源而进入无限等待的状态,导致系统无法继续执行下去的情况。死锁通常发生在以下情况下:
1. 互斥:多个进程或线程同时只能持有一个资源,如果一个进程或线程占用了一个资源,其他进程或线程就无法访问该资源。
2. 请求与保持:进程或线程在等待其他进程或线程所拥有的资源时,继续持有已经占用的资源。
3. 不可抢占:已经占用了某个资源的进程或线程不能被其他进程或线程抢占。
4. 循环等待:多个进程或线程形成一个循环等待资源的关系,每个进程或线程都在等待下一个进程或线程所拥有的资源。
死锁的解决方法包括:
1. 预防:通过破坏四个必要条件中的一个或多个条件来预防死锁的发生。
2. 避免:在资源分配的时候,使用一种资源分配算法来避免可能引发死锁的情况。
3. 检测与恢复:周期性地检测系统中是否存在死锁,如果发现死锁,则采取恢复策略(如抢占资源或终止进程)解除死锁。
4. 忽略:有些系统选择忽略死锁的发生,因为死锁发生的概率较低,解除死锁所需的系统开销较大。
package Thread1;
public class MyThread extends Thread {
static Object objA = new Object();
static Object objB = new Object();