Java多线程中问题杂谈(1)~

133 阅读2分钟

「这是我参与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:拒绝策略

向线程池提交任务的流程是什么

  1. 如果正在运行的线程数量小于corePoolSize,则创建核心线程运行此任务。
  2. 如果正在运行的线程数量大于或者等于corePoolSize,则将此任务放入阻塞队列。
  3. 如果阻塞队列满了,而且正在运行的线程数量小于maximumPoolSize,则创建非核心线程运行此任务。
  4. 如果阻塞队列满了,而且正在运行的线程数量大于或者等于maximumPoolSize,则线程池抛出RejectExecutionException异常。