38#Synchronize&DeadLock

38.1 线程安全

  • 多线程同时操作一个共享数据往往会出现安全问题

38.2 同步技术

synchronized(任意对象){
   线程要操作的共享数据;
}
  • 同步代码块
  • 线程安全导致程序运行速度慢

38.3 同步代码块原理

38.4 同步方法

public synchronize void xxxx{
   ......
}
  • 非静态同步方法锁对象是本类对象的引用this
  • 静态同步方法锁对象是类名.class

38.5  Lock接口

  • 方法
void lock(); //获取锁
void unlock(); //释放锁
  • 实现类:ReentrantLock

38.6 死锁

public class DeadLock implements Runnable{
	private int i = 0;
	public void run(){
		while(true){
			if(i%2==0){
				synchronized (LockA.locka) {
					System.out.println("if...locka");
					synchronized (LockB.lockb) {
						System.out.println("if...lockb");
					}
				}
			}else{
				synchronized (LockB.lockb) {
					System.out.println("else...lockb");
					synchronized (LockA.locka) {
						System.out.println("else...locka");
					}
				}
			}
			i++;
		}
	}

38.7 等待唤醒机制

  • 涉及的方法
void wait();  //键盘输入的时候...
void notify();  //任意唤醒一个
void notifyAll();

38.8 等待唤醒机制的案例演示

  • Resource
public class Resource {
	public String name;
	public String sex;
	public boolean flag = false;
}
  • Input
public class Input implements Runnable {
	private Resource r ;	
	public Input(Resource r){
		this.r = r;
	}
	public void run() {
		int i = 0 ;
		while(true){
		  synchronized(r){
			    if(r.flag){
			    	try{r.wait();}catch(Exception ex){}
			    }
			  
				if(i%2==0){
					r.name = "Jack";
					r.sex = "man";
				}else{
					r.name = "Rose";
					r.sex = "woman";
				}
				r.flag = true;
				r.notify();
		  }
			i++;
		}
	}
}
  • Output
public class Output implements Runnable {
	private Resource r ;
	
	public Output(Resource r){
		this.r = r;
	}
	public void run() {
		while(true){
		  synchronized(r){	
			if(!r.flag){
				try{r.wait();}catch(Exception ex){}
		    }
			System.out.println(r.name+".."+r.sex);
			r.flag = false;
			r.notify();
		  }
		}
	}
}
  • Test
public class ThreadDemo{
	public static void main(String[] args) {

		Resource r = new Resource();
		
		Input in = new Input(r);
		Output out = new Output(r);
		
		Thread tin = new Thread(in);
		Thread tout = new Thread(out);
		
		tin.start();
		tout.start();
	}
}
  • Result
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man

猜你喜欢

转载自blog.csdn.net/weixin_43660263/article/details/86608074
38