1.不同步可能导致公共资源分配不对的情况
class SaleTicketThread implements Runnable { private int ticket = 10; @Override public void run() { for (int i = 0; i < 100; i++) { if (ticket > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("还剩" + ticket-- + "张票"); } } } } public class NoSynchronized { public static void main(String[] args) { SaleTicketThread saleTicketThread = new SaleTicketThread(); for (int i = 0; i < 3; i++) { Thread thread = new Thread(saleTicketThread); thread.start(); } } }
结果:
还剩10张票
还剩9张票
还剩8张票
还剩7张票
还剩6张票
还剩5张票
还剩4张票
还剩3张票
还剩2张票
还剩1张票
还剩0张票
还剩-1张票
加上synchronized同步来保证资源
class SaleTicketThread2 implements Runnable { private int ticket = 10; @Override public void run() { for (int i = 0; i < 100; i++) { synchronized (this) { if (ticket > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("还剩" + ticket-- + "张票"); } } } } } public class HaveSynchronized { public static void main(String[] args) { SaleTicketThread2 saleTicketThread2 = new SaleTicketThread2(); for (int i = 0; i < 4; i++) { Thread thread = new Thread(saleTicketThread2); thread.start(); } } }
结果:
还剩10张票
还剩9张票
还剩8张票
还剩7张票
还剩6张票
还剩5张票
还剩4张票
还剩3张票
还剩2张票
还剩1张票
2.死锁
class ZhangSan { public void say() { System.out.println("李四,你给我画,我给你书"); } public void get() { System.out.println("张三得到画了"); } } class Lisi { public void say() { System.out.println("张三,你给我书,我给你画"); } public void get() { System.out.println("李四得到书了"); } } public class DeadLock implements Runnable { private static ZhangSan zhangSan = new ZhangSan(); private static Lisi lisi = new Lisi(); private boolean flag = false; public DeadLock(boolean flag) { this.flag = flag; } @Override public void run() { if (flag) { synchronized (zhangSan) { zhangSan.say(); try { Thread.sleep(0); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lisi) { lisi.get(); } } } else { synchronized (lisi) { lisi.say(); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (zhangSan) { zhangSan.get(); } } } } public static void main(String[] args) { DeadLock deadLock1 = new DeadLock(true); DeadLock deadLock2 = new DeadLock(false); Thread thread1 = new Thread(deadLock1); Thread thread2 = new Thread(deadLock2); thread1.start(); thread2.start(); } }
结果:
李四,你给我画,我给你书
张三,你给我书,我给你画
......
3.suspend,resume,stop都有可能导致死锁,用标志位来结束进程
class SellProduct implements Runnable { private boolean flag = true; @Override public void run() { int i = 0; while (flag) { System.out.println(Thread.currentThread().getName() + "运行,i = " + (i++)); } } public void stopSell() { flag = false; } } public class StopThread { public static void main(String[] args) { SellProduct sellProduct = new SellProduct(); Thread thread = new Thread(sellProduct); thread.start(); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } sellProduct.stopSell(); } }