JAVA基础总结(八) ---- 线程安全问题与线程池
多线程访问了共享的数据,就会产生线程安全问题
三种方法:
- 同步代码块
- 同步方法
- 锁机制
同步代码块
synchronized(锁对象){
可能会出现线程安全的代码
}
- 代码块儿中的锁对象,可以使用任意对象
- 必须保证多个线程使用的锁对象是同一个
同步方法
- 定义方法使用synchronized修饰
- 同步方法的锁对象是实现类对象 也就是 this
- 静态同步方法的锁对象不是this
锁机制
java.util.concurrent.locks
void lock() 获取锁
void unlock() 释放锁
java.util.concurrent.locks.Reentrantlock 实现了Lock接口
- 在成员位置创建一个ReentrantLock对象
- 在可能出现线程安全问题的代码前调用lock方法获取锁
- 在可能出现线程安全问题的代码后调用unlock释放获取锁
线程池
java.util.concurrent.Executors:线程池的工厂类,用来生产线程池
- 使用线程池工厂类Executors提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池
- 创建一个类,实现Runnable接口,重写run方法,设置线程任务
- 调用ExecutorService中的submit方法,传递线程任务,开启线程,执行run方法
- 调用ExecutorService总的shutdown方法,销毁线程池(不建议执行)