- 死锁:当多个线程,相互等待对方释放锁的时候,但是锁对象又不是自己,出现相互等待的状态
*
* 举例:吃饭案例
* 美国人吃饭:一个刀,一个叉
* 中国人吃饭:一双筷子
*
* 正常情况:
* 美国人左手刀,右手叉
* 中国一双筷子
* 异常情况
* 美国人,左手刀,右手一只筷子
* 中国人,一只筷子,一只叉
*
* 一直僵持,出现相互等待的状态…
*
* 死锁案例
* 2个线程,2把锁
*
* 阻塞有2个状态
* 1:sleep
* 2:wait
* 线程通信可以解决线程相互等待…
* 死锁是指两个或两个以上的进线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞(等待)的现象,
* 若无外力(唤醒)作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程称为死锁线程。
public class Demo {
public static void main(String[] args) {
DieLock d1 = new DieLock(true);
DieLock d2 = new DieLock(false);
d1.start();
d2.start();
}
}
public class DieLock extends Thread {
private static Object objA = new Object();
private static Object objB = new Object();
private boolean flag = true;
public DieLock(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
if(flag){
synchronized (objA) {
System.out.println("if ObjA");
synchronized (objB) {
System.out.println("if ObjB");
}
}
}else{
synchronized (objB) {
System.out.println("else ObjB");
synchronized (objA) {
System.out.println("else ObjA");
}
}
}
}
}
多线程的实现方式2
- 实现多线程的方案
* 1:继承Thread类,重写run方法
* 2:实现Runnable接口,重写run方法
*
* 2种方案的优缺点
* 2.1 :继承方案的优点:书写简单,缺点是耦合性太高
* 2.2:接口方案的优点:降低类与类的耦合性,缺点是书写复杂
public class Demo {
public static void main(String[] args) {
MyRunn m = new MyRunn();
Thread t1 = new Thread(m);
Thread t2 = new Thread(m);
t1.setName("线程1");
t2.setName("线程2");
t1.start();
t2.start();
}
}
public class MyRunn implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"我可以执行吗");
}
}
多线程实现卖票
public class Demo {
public static void main(String[] args) {
SellTickets s = new SellTickets();
Thread t1 = new Thread(s, "窗口1");
Thread t2 = new Thread(s, "窗口2");
Thread t3 = new Thread(s, "窗口3");
t1.start();
t2.start();
t3.start();
}
}
import java.util.Vector;
public class SellTickets implements Runnable {
int tickets = 100;
public synchronized void sellTickets(){
if(tickets>0){
try {
Thread.sleep(100L);
System.out.println(Thread.currentThread().getName()+"正在出售第"+(tickets--)+"张票");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void run() {
while(true){
sellTickets();
}
}
}