1.如何解决线程安全问题
当多个线程共享一个资源时,则可能出现线程安全问题。java中解决线程安全的方式有三种:
①同步代码快
②同步方法
③Lock锁
1.1同步代码块
synchronized(锁对象){
需要同步的代码。
}
①synchronized 同步的意思;
②锁对象可以是任何引用类型的java对象,只要是一个java对象就可以当做锁对象;
③锁对象一旦被确定下来要保证唯一性, 锁对象只能有一份。
1.2同步方法
修饰符 synchronized 返回值类型 方法名 ( 方法参数 ) {
方法体;
}
注:同步方法的默认对象就是:this
使用条件:
当你写的一个成员方法 , 这个方法内部所有的代码都使用同步代码块给包裹了 , 并且使用的锁对象是this的时候 . 就可以使用同步成员方法简化这个方法。
1.3Lock锁
手动锁,需要手动加锁和释放锁,实现类 ReentrantLock 。
早期Lock锁效率高于synchronized,但是jdk1.6后进行synchronized优化。
2.死锁
线程死锁是指由于两个或者多个线程相互持有对方所需要的锁资源,导致这些线程处于等待状态,无法继续执行。
2.1如何避免死锁
1. 使用tryLock设置获取时间。
2. 可以使用juc包下的类。--线程安全类
3. 尽量减少同步代码块的嵌套。
3.线程的通信
(1)等待:wait(long timeout)
必须在对加锁的同步代码快中。在一个线程中,调用wait()时,此线程会释放其拥有的所有锁标记,同时此线程阻塞在等待队列中。释放锁,进入等待队列。
(2)通知:notify() /notifyAll()
例子:通过两个线程完成对一个数字的+1和-1 而且两个线程需要交替执行+1和减1.
4.线程的状态
线程生命周期,线程对象从生到死一个过程,当线程被创建并启动以后,他既不是一启动就进入了执行状态,也不是一直处于执行状态。线程对象在不同的时期有不同的状态。
1.NEW: 新建状态.
2.RUNNABLE:运行状态。【就绪和运行】
3.BLOCKED:堵塞状态
4.WAITING: 等待状态
5.TIME_WAITING: 有时间的等待
6.TERMINSTED:终止