线程与进程的区别?
进程就是多个线程的集合,每一个线程都是进行的执行路径。
线程的创建方式
1.继承Thread类
2.实现Runnable接口
3.匿名内部类,也是实现Runnable接口
总结:因为java是单继承多实现,所以使用实现比使用继承更灵活。
多线程的状态
1.新建状态 new线程实例的时候;
2.就绪状态 调用start方法返回的时候,还不会立马调用run方法,需要通其他线程竞争到cpu时间;
3.运行状态 执行run方法的时候;
4.阻塞状态 线程运行过程中由于某种原因阻塞了,如:
1>调用sleep方法;
2>调用wait方法,等待唤醒;
3>调用I/O操作被阻塞;
4>试图得到锁,而锁被其他线程所持有;
5.死亡状态 run方法执行完毕,或者run方法出现异常;
什么是线程安全问题
多个线程同时共享一个全局变量并进行写的操作,可能会发成数据冲突,就是线程安全问题。做读取操作不会有线程安全问题;使用同步或者lock锁啦解决线程安全问题;
synchronized使用
1>同步代码块,将可能会发生线程安全的代码使用synchronized关键字进行包装;
2>同步方法,使用synchronized修饰方法,使用的是this锁;
3>静态同步代码块,使用的锁是 类名.class;
lock的使用
synchronized与lock的区别
1>synchronized是java的关键字,lock是一个java接口
2>synchronized可以自动释放锁,lock需要手动释放锁,lock比synchronized更灵活
3>lock可以判断是否获取锁,synchronized不行
sleep与wait的区别
1>sleep是Thread类中的方法,wait是Object类中的方法
2>sleep休眠不会释放锁,wait会释放锁
3>wait是与synchronized一起使用
4>sleep在指定时间后线程会进入就绪状态,wait需要使用notify进行唤醒才能进入就绪状态
原文:https://www.cnblogs.com/duanshijun/p/11839931.html