Demo.java:
package cn.xxx.demo; /* * 多线程并发访问同一个数据资源 * 3个线程,对一个票资源,出售 */ public class Demo { public static void main(String[] args) { //创建Runnable接口实现类对象 Tickets t = new Tickets(); //创建3个Thread类对象,传递Runnable接口实现类 (多线程) Thread t0 = new Thread(t); // 创建线程 Thread t1 = new Thread(t); Thread t2 = new Thread(t); t0.start(); // 开启线程 t1.start(); t2.start(); } }Tickets.java(线程类,实现Runnable接口,重写run方法):
package cn.xxx.demo; /* * 多线程可能会出现安全问题 * 解决安全问题,同步技术 * 公式: * synchronized(任意对象){ * 多个线程要操作的共享数据 * } * */ public class Tickets implements Runnable{ // 实现Runnable接口 private int ticket = 100; private Object lock = new Object(); // 共享的锁对象。 成员变量位置,所有线程可以共享该锁对象。 public void run(){ // 重写run方法 while(true){ //线程共享数据,保证安全,加入同步代码块 synchronized(lock){ // 同步。 同步可以保证线程安全,但却降低了运行效率。 if( ticket > 0){ try{ Thread.sleep(10); }catch(Exception ex){} System.out.println(Thread.currentThread().getName()+" 出售第 "+ticket--); } } } } }