「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」
synchronized与Lock的异同?
-
相同:二者都可以解决线程安全问题
-
不同:
- Synchronized是Java中的关键字,Synchronized是内置的语言实现的,Java机制在执行完相应的同步代码块之后,自动释放同步监视器,Lock需要手动的启动同步(Lock()),同时结束同步也需要手动的实现(unLock())
- synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生
- Lock是一个接口,在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁。
- Lock可以让等待锁的线程响应中断,而synchronized却不行
- 通过Lock可以知道有没有成功获取锁,而synchronized却无法办到
- Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。
介绍一下Syncronized锁,如果用这个关键字修饰一个静态方法,锁住了什么?如果修饰成员方法,锁住了什么?
- 修饰静态方法:使用的是(类.class)锁。
- 修饰成员方法:使用的是调用该方法的对象实例的对象锁。
优先使用顺序?
- Lock —>同步代码块(已经进入了方法体,分配了相应的资源)—>同步方法(在方法体之外)
为什么要使用线程池?
-
优点:
- 1.提高响应速度(减少了创建新线程的时间)
- 2.降低资源消耗(重复利用线程池中线程,不需要每次都创建)
- 3.便于线程管理
线程池都有哪些设置参数?
- corePoolSize:线程池核心线程大小
- maximumPoolSize:线程池最大线程数量
- keepAliveTime:空闲线程存活时间
- unit:空闲线程存活时间单位
- workQueue:工作队列
- threadFactory:线程工厂
- handler:拒绝策略
向线程池提交任务的流程是什么
- 如果正在运行的线程数量小于corePoolSize,则创建核心线程运行此任务。
- 如果正在运行的线程数量大于或者等于corePoolSize,则将此任务放入阻塞队列。
- 如果阻塞队列满了,而且正在运行的线程数量小于maximumPoolSize,则创建非核心线程运行此任务。
- 如果阻塞队列满了,而且正在运行的线程数量大于或者等于maximumPoolSize,则线程池抛出RejectExecutionException异常。