类Tickets实现Runnable接口:
/*
* 采用同步方法形式,解决线程的安全问题
* 好处:代码量简洁
* 将线程共享数据,和同步,抽取到一个方法中
* 在方法的声明上,加入同步关键字
*
* 问题:
* 删掉obj,同步方法中还有锁吗? 肯定有,同步方法中的对象锁,是本类对象引用this
* 如果方法是静态的,同步有锁吗?是this吗? 绝对不是this,锁是本类自己.class属性
* 静态方法,同步锁是本类类名.class属性
*/
public class Tickets implements Runnable {
//定义可以出售的票源
private static int ticket=100;
//private Object obj=new Object();
public void run(){
while(true){
payTicket();
}
}
public static synchronized void payTicket(){
//对票数判断,大于0,可以出售
if(ticket>0){
try{
Thread.sleep(10);
}catch(Exception ex){}
System.out.println(Thread.currentThread().getName()+ "出售第"+ticket--);
}
}
}
测试Demo类:
/*
* 多线程并发访问同一个数据资源
* 3个线程,对一个票资源,出售
*/
public class ThreadDemo {
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();
}
}