线程同步和死锁(传智播客)

一.同步
多线程在操作共享资源时,某一时刻只能有一个线程操作共享资源。
1.同步代码块

public class MyThread implements Runnable{
	
	private int num = 400;
	Object obj = new Object();
	/* (non-Javadoc)
	 * @see java.lang.Thread#run()
	 */
	@Override
	public void run() {
		while(true){
			synchronized(obj){
				if(num>0){
					System.out.println(Thread.currentThread().getName()+"...is saling..."+num);;
					num--;
				}
			}
		}
	}

	public static void main(String[] args) {
		MyThread my = new MyThread();
		Thread t0 = new Thread(my);
		Thread t1 = new Thread(my);
		t0.start();
		t1.start();	
	}
}

2.同步方法

public class MyThread implements Runnable{
	
	private int num = 400;

	@Override
	public void run() {
		while(true){
			fun();
		}
	}
	
	public synchronized void fun(){
		if(num>0){
			System.out.println(Thread.currentThread().getName()+"...is saling..."+num);;
			num--;
		}
	}
	
	public static void main(String[] args) {
		MyThread my = new MyThread();
		Thread t0 = new Thread(my);
		Thread t1 = new Thread(my);
		t0.start();
		t1.start();	
	}
}

3.两者的区别

  • 同步代码块的锁是任意的,同步方法的锁是固定的, 静态同步方法的锁是该方法所属的对象(当前类运行时对象)。
  • 同步的前提是必须有多个线程使用同一个锁。
  • 判断锁的状态,会消耗系统资源从而导致程序的效率低。

二.死锁
1.什么是死锁
指多个线程竞争资源导致互相等待的僵局,如果没有外力的作用,这种现象将一直持续下去。
2.产生的条件

  • 互斥:指共享资源在某一时刻只能被一个线程所占有,具有排他性。
  • 不剥夺:指被线程所占有的资源不能被其它线程强行夺走,除非自己释放。
  • 保持和请求:请求新资源的线程在占有一个资源的情况下,处于阻塞状态并且不释放已有的资源。
  • 循坏等待链:有这样一种等待链,链上的线程所占有的资源是其它线程正在请求的资源。
    3.实例
public class MyThread implements Runnable{
    boolean flag = true;
    Object chinese = new Object();
    Object american = new Object();
	@Override
	public void run() {
		if(flag){
			while(true){
				synchronized(american){
					System.out.println("...if...american");
					synchronized(chinese){
						System.out.println("...if...chinese");
					}
				}
			}
		}
		else{
			while(true){
				synchronized(chinese){
					System.out.println("...else...chinese");
					synchronized(american){
						System.out.println("...else...american");
					}
				}
			}
		}
	}

	public static void main(String[] args) {
		MyThread my = new MyThread();
		Thread t0 = new Thread(my);
		Thread t1 = new Thread(my);
		t0.start();
		try{
			Thread.sleep(10);
		}catch(InterruptedException e){
			
		}
		my.flag = false;
		t1.start();
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章