一.线程安全
1.根本原因: 当多个线程操作共享数据的时候才可能会出现线程安全问题
2.如何解决
<1>使用synchronized解决
synchronized (锁) {
需要被看成整体的代码
}
<2>使用同步方法
1.不能指定锁, 导致有些代码无法锁住
2.一锁锁所有, 不能局部锁
普通的方法 this
静态的方法 当前类的字节码对象
<3>.使用Lock锁
1.必须维护锁, 保证锁的唯一
2.必须将释放锁的代码放到finally代码块, 必须保证锁释放, 否则出现锁死的情况
注意事项:一定保证锁对象一致
二.线程间通信
1.作用: 让线程有规律执行任务
2.步骤
1.需要通信的多个线程共享同一个条件
2.需要多条线程加同一把锁对象
3.使用锁的通信方法来完成通信
wait()让当前线程处于等待
notify()唤醒本锁其他任意一条线程
notifyAll()唤醒本锁上的所有线程
三.线程池
1.作用: 解决创建线程和销毁线程, 这个过程很耗内存以及时间
(2). 造线程池ThreadPoolExecutor--->
int corePoolSize核心线程数量
,int maximumPoolSize最大线程数量
, long keepAliveTime临时线程存活的时间
, TimeUnit unit,时间的单位, 是枚举
BlockingQueue<Runnable> workQueue,等待的队列1.ArrayBlockingDeque2.LinkedBlockingDueue
ThreadFactory threadFactory,Executors.defaultThreadFactory()
RejectedExecutionHandler handler
1.new ThreadPoolExecutor.AbortPolicy()超出的任务直接舍弃, 并且抛出异常
2.new ThreadPoolExecutor.DiscardPolicy() : 移除最新进来的那个任务,不报异常
3.new ThreadPoolExecutor.DiscardOldestPolicy(): 移除等待最久的那个任务, 让新任务添加进去,不报异常
4.new ThreadPoolExecutor.CallerRunsPolicy() : 线程池处理不了, 交给主线程
(3).使用线程池:submit(Runnable r);