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、死锁问题。