多线程学习笔记(2)使用同步代码块解决线程安全问题

class TrianThread1 implements Runnable {
	//总共有一百张火车票
	private int i =100;
	private Object obj = new Object();
	
	@Override
	public void run() {
		//模拟抢票
		while (i > 0 ){
			try {
				Thread.sleep(50);
			} catch (Exception e) {
				// TODO: handle exception
			}
			sale();
		}
	}
	
	
	public void sale(){
		synchronized (obj) {
			if(i>0){
				System.out.println(Thread.currentThread().getName()+"出售第"+(100-i+1)+"张票");
				i--;
			}
		}
	}
}

public class ThreadDemo {

	public static void main(String[] args) {
		TrianThread1 trianThread1 = new TrianThread1();
		Thread t1 = new Thread(trianThread1,"窗口1");
		Thread t2 = new Thread(trianThread1,"窗口2");
		t1.start();
		t2.start();
	}
}

同步的必要条件:
1、必须要有两个线程以上,需要发生同步。

2、多个线程想同步,必须用同一把锁。
3、保证只有一个线程进行执行。

原理:
1、有一个线程已经拿到锁,其他线程已经有cpu执行权,一直排队,等待其他线程释放锁。

2、锁是在什么时候释放的?代码执行完毕或者是程序抛出异常都会被释放掉。
3、锁已经被释放掉的话,其他线程开始获取锁进入同步中去。

4、锁的资源竞争导致效率非常低。
5、死锁问题。

猜你喜欢

转载自blog.csdn.net/huermiss/article/details/80267434