从买票问题开始
package com.google.thread; /** * 买票示例下的安全问题。 * 出现的原因 * * 解决思路 * * 同步代码块。 * * 火车上的卫生间。 */ class Ticker implements Runnable{ public int num = 100; Object obj=new Object(); public void run() { while (true) { //同步代码块 if (num > 0) { try { Thread.sleep(10); System.out.println(Thread.currentThread().getName() + "...." + num--); } catch (InterruptedException e) { e.printStackTrace(); } } } } } /* 线程安全问题。会卖出0号票。 Thread-3....-1 Thread-1....2 Thread-2....0 */ public class ThreadDemo extends Thread { public static void main(String[] args) { Ticker t = new Ticker(); Thread t1=new Thread(t);//创建线程 Thread t2=new Thread(t); Thread t3=new Thread(t); Thread t4=new Thread(t); t1.start();//开启线程 t2.start(); t3.start(); t4.start(); } }
线程安全问题。
会卖出0号票。
多个线程在操作共享的数据。
操作共享数据的线程代码有多条。
当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算。就会导致线程安全问题的产生。
解决方法