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 * * 问题: * 同步方法的对象锁是本类对象引用 this * 如果方法是静态,对象锁是本类类名.class 属性 */ public class Tickets implements Runnable{ // 实现Runnable接口 //定义出售的票源 private int ticket = 100; public void run(){ // 重写run方法 while(true){ payTicket(); } } public synchronized void payTicket(){ // synchronized 同步方法。 对象锁是this。 同步静态方法的对象锁是类名.class if( ticket > 0){ try{ Thread.sleep(10); }catch(Exception ex){} System.out.println(Thread.currentThread().getName()+" 出售第 "+ticket--); } } }