实现线程的几种方式
- 继承Thread类
synchronized(Window.class):反射 - 实现Runnable接口
synchronized(this) - JDK5.0新增两种
- 实现Callable接口
- 使用线程池方法
使用继承Thread方式
使用private static int ticket = 100修饰充当共享变量- 需要几个线程,就
new几个·线程,分别调用线程的start
实现Runnable方法
- 创建多线程时共用一个实例对象
- 通过Thread类的对象调用start,在这里可以创建多线程
两种方式的比较
- 开发中建议使用实现Runnable,因为java是单继承的,基础Thread之后可以影响了Window的其他性能
- 实现时自然实现了共享数据,所以对于共享数据的多线程,建议使用实现
联系
线程安全问题:线程同步机制
同步好处:解决了线程安全问题
同步坏处:操作同步代码时,只有一个线程参与,其他线程等待,相当于是一个单线程问题,效率低
-
三种方式 -
同步代码块:synchronized(同步监视器
锁)任何一个类的对象,都可以充当锁,多个线程必须同用一把锁可以new一个任意的对象充当锁,比如:Object static obj = new Object() -
同步方法: 将操作共享数据的完整代码声明在一个方法中,可以将方法声明为同步方法
同步方法仍涉及到同步监视器,只不过不需要我们显示声明 ①非静态的同步方法,同步监视器是`this`,也就是当前对象,继承Thread时可能会有多个对象 `synchronized void show()` ②静态的同步方法,同步监视器是当前类本身 `public static synchronized void show()` -
锁
继承Thread类+同步代码块
实现Runnable+同步代码块
可以使用当前方法的this,实现runnable有天然的唯一对象
而在继承的方式中,this可能有多个,但可以使用当前类作为对象充当锁,类在内存中只会加载一次,所以只有一个
继承Thread类+同步方法
错误示范
正确示范
实现Runnable接口+同步方法
总结
- 同步方法也涉及到同步监视器,只不过不需要显示的声明
- 非静态的同步方法,同步监视器是this -> 当前对象
- 静态的同步方法,同步监视器是:当前类本身
线程安全之单例模式的懒汉式
单例模式:程序运行时,在java虚拟机中只存在该类的一个实例对象 static唯一
- 懒汉式单例模式