使用多线程实现抢票问题

96 阅读2分钟

实现线程的几种方式

  • 继承Thread类 synchronized(Window.class):反射
  • 实现Runnable接口 synchronized(this)
  • JDK5.0新增两种
  • 实现Callable接口
  • 使用线程池方法

使用继承Thread方式

  • 使用private static int ticket = 100修饰充当共享变量
  • 需要几个线程,就new几个·线程,分别调用线程的start

1.png

2.png

实现Runnable方法

  • 创建多线程时共用一个实例对象
  • 通过Thread类的对象调用start,在这里可以创建多线程

1.png

2.png

两种方式的比较

  • 开发中建议使用实现Runnable,因为java是单继承的,基础Thread之后可以影响了Window的其他性能
  • 实现时自然实现了共享数据,所以对于共享数据的多线程,建议使用实现
  • 联系

1.png

线程安全问题:线程同步机制

同步好处:解决了线程安全问题 同步坏处:操作同步代码时,只有一个线程参与,其他线程等待,相当于是一个单线程问题,效率低

  • 三种方式

  • 同步代码块:synchronized(同步监视器)任何一个类的对象,都可以充当锁,多个线程必须同用一把锁

      可以new一个任意的对象充当锁,比如:Object static obj = new Object()
    
  • 同步方法: 将操作共享数据的完整代码声明在一个方法中,可以将方法声明为同步方法

      同步方法仍涉及到同步监视器,只不过不需要我们显示声明
      ①非静态的同步方法,同步监视器是`this`,也就是当前对象,继承Thread时可能会有多个对象
      `synchronized void show()`
      ②静态的同步方法,同步监视器是当前类本身
      `public static synchronized void show()`
    

继承Thread类+同步代码块

1.png

实现Runnable+同步代码块

可以使用当前方法的this,实现runnable有天然的唯一对象

1.png

而在继承的方式中,this可能有多个,但可以使用当前类作为对象充当锁,类在内存中只会加载一次,所以只有一个

1.png

继承Thread类+同步方法

错误示范

1.png 正确示范

1.png

实现Runnable接口+同步方法

1.png 总结

  • 同步方法也涉及到同步监视器,只不过不需要显示的声明
  • 非静态的同步方法,同步监视器是this -> 当前对象
  • 静态的同步方法,同步监视器是:当前类本身

线程安全之单例模式的懒汉式

单例模式:程序运行时,在java虚拟机中只存在该类的一个实例对象 static唯一

  • 懒汉式单例模式

1.png

1.png

1.png