zoukankan      html  css  js  c++  java
  • 问题整理

    1、Java内存模型是什么? 
    Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。
    Java内存模型对一个线程所做的变动能被其它线程可见提供了保证
    cpu和主内存同步的过程中 系统会为cpu并行指令做一些重排序优化,从而提高了效率
    在并发编程模式中,势必会遇到上面三个概念
    1、可见性
    2、有序性
    3、原子性
    在Java中提供了一系列和并发处理相关的关键字,比如volatile、synchronized、final包等
    JMM提供的解决方案:
    可以使用synchronized关键字或者重入锁(ReentrantLock)保证程序执行的原子性 而工作内存与主内存同步延迟现象导致的可见性问题
    也可以使用volatile关键字解决 可以使一个线程修改后的变量立即对其他线程可见 volatile的另外一个作用就是禁止重排序优化


    2、Java中CyclicBarrier 和 CountDownLatch有什么不同?
    CyclicBarrier 和 CountDownLatch 都可以用来让一组线程等待其它线程。与 CyclicBarrier 不同的是,CountdownLatch 不能重新使用,
    CyclicBarrier ++ 到指定值 , CountDownLatch countDown-- await() //等待,当计数减到0时,所有线程并行执行


    3、volatile是什么?
    主要是用来在多线程中同步变量 (读指令和写指令都会插入 内存屏障)
    当一个变量被volatile修饰后,该变量就不能被缓存到线程的内存中,它会告诉编译器不要进行任何移出读取和写入操作的优化,(线程-> cpu寄存器 -> cpu缓存 -> 主内存)
    1.保证此变量对所有的线程的可见性 (保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新) (内存可见性是通过store(写)和load(读)指令完成的)
    2.禁止指令重排序优化 (指令重排序时不能把后面的指令重排序到内存屏障之前的位置)
    volatile仅仅用来保证该变量对所有线程的可见性,但不保证原子性.
    字段是volatile,Java内存模型将在写操作后插入一个写屏障指令,在读操作前插入一个读屏障指令

    7、什么是线程安全?Vector是一个线程安全类吗?
    多线程和单线程每次运行结果和单线程运行的结果是一样的,就是线程安全的
    Vector 不是线程安全的,只能保证单个操作安全,复合操作同样不安全

    8、什么是竞态条件?
    多线程对一些资源的竞争的时候就会产生竞态条件,如果首先要执行的程序竞争失败排到后面执行了,那么整个程序就会出现一些不确定的bugs,因为线程间的随机竞争

    13、什么是FutureTask?
    可用于异步获取执行结果或取消执行任务的场景
    只有当运算完成的时候结果才能取回,如果运算尚未完成get方法将会阻塞  。。。。。。待完善。。。

    16、同步集合与并发集合有什么区别
    不管是同步集合还是并发集合他们都支持线程安全,他们之间主要的区别体现在性能和可扩展性
    同步集合类:Hashtable、Vector
    并发集合类:ConcurrentHashMap (对相关的几个片段上锁,同时允许多线程访问其他的片段)
    同步集合比并发集合会慢得多,主要原因是锁(synchronized)

    15、如果同步块内的线程抛出异常会发生什么? 线程都会释放锁


    17、单例模式的双检锁是什么?
    if(instance==null) {
       synchronized(Singleton4.class) {
          if(instance==null) {
               instance = new Singleton4();
          }
       }
    }
    第一个if 一个锁
    兼顾线程安全性与非null性判断.

    18、为什么使用voliate修饰变量?
    使用voliate修饰之后,保证线程可见性与禁止指令重排序.

    。。。。。。待完善。。。

    。。。。。。待完善。。。






    群交流(262200309)
  • 相关阅读:
    Python基础(2)
    Python基础(3)
    Python基础(1)
    [日本语]单词1
    【.Net】 C#参数数组与函数重载
    pyenv
    Pip批量安装/卸载包
    Xcode中模拟器慢
    iPhone的设备名转换
    在python命令行执行sudo命令
  • 原文地址:https://www.cnblogs.com/webster1/p/12246106.html
Copyright © 2011-2022 走看看