什么是锁
通俗理解就是,将要加锁的代码放到一个房间里,这个房间一次只能有一个人进去,进去的人把锁锁上,在里面操作,不让别人进来,只有当进去的人把锁打开出来后,别的人才能争抢进去.
加锁的方式有:
同步代码块–任意锁对象(多个线程互斥访问,锁对象必须相同)
synchronized (锁对象){
//包裹你可能出现数据安全问题的代码
}
同步方法–锁对象为this
public synchronized void test(){
//包裹你可能出现数据安全问题的代码
}
静态同步方法–锁对象为类的.class文件
public static synchronized void test(){
//包裹你可能出现数据安全问题的代码
}
还有一种加锁的方式是Lock接口
ReentrantLock lock = new ReentrantLock();
lock.lock();//加锁
//中间写要会出现安全性要加锁的代码
lock.unlock();//释放锁
什么是死锁
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
举例:
例如,现在有公共资源一支笔和一个本子,
现在有两个线程,线程一抢到了笔,线程二抢到了本子,
线程一说,你把本子给我,我就可以把笔给你,
线程二说,你把笔给我,我就把本子给你.
此时线程之间谁也不让谁,互相都不放弃已经拥有的资源
就造成了一种循环等待的情况.就是死锁
举例:
一桌人吃饭,每人旁边只有一支筷子,每次最多只能有一半的人拿起左边筷子和右边的筷子,然后吃饭,如果现在每个人都拿起了自己的一支筷子,则谁也不愿意给别人,就会造成死锁.
死锁现象:
出现在同步代码块相互嵌套,多个线程 互相持有对方的锁,而不释放,造成线程一直处于阻塞状态
死锁问题概述
如果出现了同步嵌套,就容易产生死锁问题
死锁是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象
死锁代码:
线程类:
package com.westos.morning;
public class MyThread extends Thread {
//死锁
public static Object obj1=new Object();
public static Object obj2=new Object();
Boolean flag;
public MyThread(Boolean flag) {
this.flag=flag;
}
public MyThread() {
}
@Override
public void run() {
if (flag) {
synchronized (obj1) {
System.out.println("true 进入 obj1");
try {
sleep(10);//为了效果明显,加了点延时
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println("true 进入 obj2");
}
}
} else {
synchronized (obj2) {
System.out.println("flase 进入 obj2");
synchronized (obj1) {
System.out.println("flase 进入 obj1");
}
}
}
}}
主类:
package com.westos.morning;
public class Demo2 {
//死锁
public static void main(String[] args) {
MyThread myThread = new MyThread(true);
MyThread myThread1 = new MyThread(false);
myThread.start();
myThread1.start();
}
}
形成了循环等待
谢谢!