美文网首页
Java多线程

Java多线程

作者: juexin | 来源:发表于2017-06-21 15:59 被阅读0次

    静态方法和普通方法同时加上synchronized有什么区别?

    A. 无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。
    B. 每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码。
    C. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

    线程池的类型,固定大小的线程池内部是如何实现的,等待队列是用了哪一个队列实现

    线程池的底层实现

    谈一谈对volatile理解,这个问题很常见,答出要点: 可见性、防止指令重排即可

    多线程:创建多线程的三种方法及其区别,线程同步方法,synchronize和ReentrantLock的区别,synchronize的用法(修饰类,方法,代码块等)以及使用对象是什么,sleep和wait的区别

    指令重排的含义

    volatile 原理 使用 指令重排 内存屏障 保证内存可见性

    volatile实现,锁分类介绍、AQS介绍、公平锁非公平锁介绍。

    volatile关键字

    volatile关键字是Java并发的最轻量级实现,本质上有两个功能,在生成的汇编语句中加入LOCK关键字和内存屏障 作用就是保证每一次线程load和write两个操作,都会直接从主内存中进行读取和覆盖,而非普通变量从线程内的工作空间(默认各位已经熟悉Java多线程内存模型)

    但它有一个很致命的缺点,导致它的使用范围不多,就是他只保证在读取和写入这两个过程是线程安全的。如果我们对一个volatile修饰的变量进行多线程下的自增操作,还是会出现线程安全问题。根本原因在于volatile关键字无法对自增进行安全性修饰,因为自增分为三步,读取-》+1-》写入。中间多个线程同时执行+1操作,还是会出现线程安全性问题。

    synchronized

    锁的优化:偏向锁、轻量级锁、自旋锁、重量级锁
    锁的膨胀模型,以及锁的优化原理,为什么要这样设计
    与Concurrent包下的Lock的区别和联系

    Lock能够实现synchronized的所有功能,同时,能够实现长时间请求不到锁时自动放弃、通过构造方法实现公平锁、出现异常时synchronized会由JVM自动释放,而Lock必须手动释放,因此我们需要把unLock()方法放在finally{}语句块中

    concurrentHashMap

    两个hash过程,第一次找到所在的桶,并将桶锁定,第二次执行写操作。

    而读操作不加锁,JDK1.8中ConcurrentHashMap从1600行激增到6000行,中间做了很多细粒度的优化,大家可以查一下。

    锁的优化策略

    ① 读写分离
    ② 分段加锁
    ③ 减少锁持有的时间
    ④ 多个线程尽量以相同的顺序去获取资源
    等等,这些都不是绝对原则,都要根据情况,比如不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。这部分跟面试官谈了很久

    线程池的配置 Excutor 以及Connector的配置

    线程池的种类、原理(threadpoolexecutor)、threadpoolexecutor的参数有哪些?

    线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。就好比原来去食堂打饭是每个人看谁抢的赢,谁先抢到谁先吃,有了线程吃之后,就是排好队形,今天我跟你关系好,你先来吃饭。比如:一个应用要和网络打交道,有很多步骤需要访问网络,为了不阻塞主线程,每个步骤都创建个线程,在线程中和网络交互,用线程池就变的简单,线程池是对线程的一种封装,让线程用起来更加简便,只需要创一个线程池,把这些步骤像任务一样放进线程池,在程序销毁时只要调用线程池的销毁函数即可。

    单个线程的弊端
    a. 每次new Thread新建对象性能差
    b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或者OOM,
    c. 缺乏更多功能,如定时执行、定期执行、线程中断。

    Java提供的四种线程池的好处在于:
    a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
    b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
    c. 提供定时执行、定期执行、单线程、并发数控制等功能。

    Java通过Executors提供四种线程池,分别为:
    newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
    newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
    newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
    newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
    (1). newCachedThreadPool
    创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
    (2). newFixedThreadPool
    创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
    (3). newScheduledThreadPool
    创建一个定长线程池,支持定时及周期性任务执行。ScheduledExecutorService比Timer更安全,功能更强大
    (4). newSingleThreadExecutor
    创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行

    线程通信、同步的方法。

    Lock 比起 Synchronized 的优势在哪里;读写锁的优势。

    锁的类型、重入锁的原理(aqs)、aqs的常用方法

    synchronized可重入吗?

    synchronized可以替代读写锁吗?

    Lock内部实现

    终止线程有几种方式?终止线程标记变量为什么是 valotile 类型?

    用过哪些并发的数据结构? cyclicBarrier 什么功能?信号量作用?数据库读写阻塞怎么解决

    线程的中断

    线程的Interrupt中断,其实只是修改线程的中断位,并不会真正停止线程。(1)可以通过Thread的类方法interrupted检查当前线程是否中断,但是会重置标志位(2)通过调用Thread的普通方法isInterrupted来检查中断位,不会重置标志位。

    线程调用中断方法不会停止程序,那么有什么用?

    谈了谈线程池中,线程销毁,假如没有中断那么就一直while检查不断执行任务。如果中断后,就return方法。就是return Runnable的run方法,线程运行完毕自然就可以销毁。(下来查资料看到真正的中断用法)其实中断线程有很多方法:(1)通过检查标志位用break退出循环(2)通过return退出run方法(3)通过对有些状态中断抛异常退出。

    多线程,线程同步,锁

    sleep 与 wait 方法的区别

    image.png

    synchronized 与 volatile 的比较,哪个保证原子性

    CountDownLatch

    BLOCKED 与 TIMED_WAITING 的区别

    Java 多线程机制,锁

    自旋锁

    redis的配置文件(AOF&&Snapshot&&主从复制)

    Java多线程,线程池有哪几类,每一类的差别

    ThreadLocal原理,线程池工作流程

    synchronized 实现原理

    ReentrantLock源码,AQS,synchronized实现

    Thread中,ThreadLocal,Lock等

    一道线程通信问题,给你三个线程,然后分别处理任务,再交给主线程,你如何实现。

    线程池有几种实现方式,分别介绍一下(ThreadPoolExecutor, Executors里面有四种,其实都是调用的ThreadPoolExecutor), Executors中四种实现方式的区别,项目中用的哪种实现方式,我说newFixedThreadPool, 线程数 设置为多大,根据什么依据。这种实现方式下,用的什么阻塞队列,默认队列的长度是多少

    ConcurrentHashMap原理,jdk1.8后有哪些改变(引入CAS等)

    问为什么项目中需要只用ConcurrentHashMap做缓存,和Redis有什么区别吗(map可以作为内存式缓存,短时间访问量高可以使用)

    ConucrrentHashmap原理,Java8做了哪些改变,有引入CAS,问什么是CAS,和自旋锁有什么区别

    Redis在项目中怎么使用的,我说做缓存,用户token存放在redis中,有提到在redis中维持一个订单流水号保证唯一性,问为什么redis中可以保证,主要就是redis是单线程的,redis中命令都是原子操作

    redis怎么实现分布式锁(sentnx命令可以实现)

    线程池怎么实现的?线程池中线程的数量怎么设定? jdk 怎么监控线程状态与线程数量? jstack 打印线程状态,分析线程负载状况? linkedBlockingQuene 与 ArraylistQuene 区别

    信号量是什么,怎么使用

    阻塞队列了解吗?怎么使用

    相关文章

      网友评论

          本文标题:Java多线程

          本文链接:https://www.haomeiwen.com/subject/vsswqxtx.html