线程的同步和死锁
同步问题的引出
package 阿里云大学java.java高级学习;
class MyThread implements Runnable{
private int ticket = 10;
@Override
public void run(){
while(true){
if(ticket > 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "抢到票了,号码是:" + this.ticket--);
}else{
System.out.println("###没有票了!!!###" + Thread.currentThread().getName());
break;
}
}
}
}
public class 线程的休眠处理 {
public static void main(String[] args) throws InterruptedException {
MyThread ans = new MyThread();
new Thread(ans,"小明").start();
new Thread(ans,"小黑").start();
new Thread(ans,"小红").start();
}
}
- 通过程序结果,我们可以看出来,在追加了休眠以后,有时候会出现抢同一个票的情况,甚至还有出现抢到了负数的情况。
- 这就是同步问题的引出。
- 那么接下来,我们就来体验一下什么叫做线程同步处理。
线程同步处理
- 那么解决同步问题的关键是什么呢,最主要是 锁。
- 那么如何实现这个锁呢,java提供了synchronized 关键字。
- 利用此关键字,可以定义我们的同步方法或者同步代码块。
class MyThread implements Runnable{
private int ticket = 10;
@Override
public void run(){
while(true){
synchronized (this){
if(ticket > 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "抢到票了,号码是:" + this.ticket--);
}else{
System.out.println("###没有票了!!!###" + Thread.currentThread().getName());
break;
}
}
}
}
}
public class 线程的休眠处理 {
public static void main(String[] args) throws InterruptedException {
MyThread ans = new MyThread();
new Thread(ans,"小明").start();
new Thread(ans,"小黑").start();
new Thread(ans,"小红").start();
}
}
- 这样子,我们就解决了,数据不同步而产生的问题。
- 但是加入同步以后,程序的性能也会下降了。
- 在我们多线程处理之中,有可能会产生死锁。
线程死锁
- 死锁是指线程中若干个线程彼此等待很久的状态。导致了死锁。
- 有的时候代码处理不当,会不定期出现死锁。这属于正常开发中的调试问题。
- 若干的线程访问同一资源时,一定要进行同步处理,但是呢,过多的同步处理,可能会造成死锁。
- 死锁,都是由于同步过多引起的。