类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(); ?? ?} }
(编辑:北几岛)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|