死锁:不同的线程分别占用对方需要的同步资源,都在等待对方放弃自己所需的同步资源,进而形成了死锁。
1.出现死锁后,不会出现异常,不会出现提示,所有的线程都处于阻塞状态,无法继续
2.我们在使用同步时,要避免出现死锁
synchronized与Lock:
1.Lock是显式锁,需要手动开启和关闭,synchronized是隐式锁,出来作用域之后会自动释放
2.Lock只有代码块锁,synchronized有代码块和方法锁
3.两者都可以解决线程安全问题
优先使用:lock----同步代码块-----同步方法
* 解决线程安全问题的方式三:Lock锁, JDK5.0新增
class Window implements Runnable{
private int ticket=100;
//1.实例化ReentrantLock
private ReentrantLock lock=new ReentrantLock();
@Override
public void run() {
while(true){
try {
//2.调用锁定方法lock()
lock.lock();
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":售票,票号为:" + ticket);
ticket--;
}else {break;}
}finally {
//3.调用解锁方法unlock
lock.unlock();
} } }}
public class LockTest {
public static void main(String[] args) {
Window w=new Window();
Thread t1=new Thread(w);
Thread t2=new Thread(w);
Thread t3=new Thread(w);
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start(); }
//1.实例化ReentrantLock
private ReentrantLock lock=new ReentrantLock();
//2.调用锁定方法lock()
lock.lock();
//3.调用解锁方法unlock
lock.unlock();