1 实现方式
线程的实现有2种方式:
继承Thread;
实现Runnable;(推荐使用)
2 实现Runnable好处
将线程的任务从线程的子类中分离出来,进行了单独的封装。按照面向对象的思想将任务封装成对象。
避免了Java单继承的局限性;
为后期的代码功能扩展性提供便利。
3 两种线程方式区别
继承Thread:线程代码存放Thread子类run方法中;
实现Runnable,线程代码存在接口的子类的run方法;
在多线程中,Thread为多个线程对象,而Runnable只有一个Runnable对象。
4 线程安全问题的产生原因
多线程在操作共同数据;
操作共享数据的代码有多条。
5 解决安全问题
1 思路
就是将多条操作共享数据的代码进行封装,当有线程执行这些代码的时候,其他的线程不可参与其中。
2 解决方案
使用synchronized关键字。
同步代码块:锁对象为Obj;建议使用。
非静态同步函数:this,当前类对象;
静态同步函数:XXX.class 该函数所属字节码文件对象,不可以用getClass()表示(非静态方法,不可用在静态方法中)。
6 同步的利弊
好处:解决了线程的安全问题;
弊端:占用CPU内存资源,多次判断锁,相对效率低,但在可接受范围之内;
7 同步的前提
必须有多线程同时使用一个公共资源。