先看下面的程序来售票
1 package thread; 2 3 public class Ticket { 4 public static void main(String[] args) { 5 SaleWindow saleWindow1 = new SaleWindow(); 6 SaleWindow saleWindow2 = new SaleWindow(); 7 SaleWindow saleWindow3 = new SaleWindow(); 8 9 saleWindow1.start(); 10 saleWindow2.start(); 11 saleWindow3.start(); 12 } 13 } 14 15 class SaleWindow extends Thread { 16 private static int ticket_num = 100; 17 @Override 18 public void run() { 19 while (true) { 20 if (ticket_num <= 0) { 21 System.out.println("售票结束"); 22 break; 23 } 24 // 休眠50毫秒。模拟卖票要时间 25 try { 26 Thread.sleep(50); 27 } catch (InterruptedException e) { 28 e.printStackTrace(); 29 } 30 System.out.println("当前窗口为 " + Thread.currentThread().getName() + "还剩 " + (--ticket_num) + "张票"); 31 32 } 33 } 34 }
输出结果分析:
出现上面情况的原因分析:、
线程123都会判断<=0不是成立的
所以123线程同时进到下面代码
解决方案:
1)用synchronized关键字:synchronized是Java中的一个关键字,是一个内部锁。它可以使用在方法上和方法块上,表示同步方法和同步代码块。在多线程环境下,同步方法或者同步代码块在同一时刻只允许有一个线程在执行,其余线程都在等待获取锁,也就是实现了整体并发中的局部串行。
同步概念:
1)在多线程编程,一些敏感数据不允许多个线程同时访问。也就是数据在同一个时刻,最多有一个线程访问,保证数据的完整性安全性(窗口卖票系统)
2)也可以这样理解,当有一个线程在对内存进行操作时,其它线程都不可以对这个内存地址进行操作,知道该线程完成操作,其它线程才可以对该地址进行操作
同步的实现方法:
最简单的就是加关键字Synchronized