zoukankan      html  css  js  c++  java
  • java详细剖析

    1·类型加载主动初始化和被动初始化两种,通过访问静态变量或者给静态变量赋值都是可以使类初始化,如果有继承关系,所依赖的父类都会被动初始化。


    2·如果在类的静态变量中添加final关键字,那这个变量就会被放入当前类的常量池中,删除类源文件以及class字节码都不会影响常量池中的内容,这个是在“编译阶段”完成的;而且在编译之后会生成“助记符”标记常量;
    不同助记符所表示的数据类型不同:
    ldc表示int,float,String
    bipush表示单字节(-128~127)
    sipush表示短整型常数(-32768~32767)


    3·volatile有两大特性和一个不完美:在禁止指令重排序和多线程修改值可见以外却没有原子特性。
    -》volatile由于可以禁止指令重排序,所以单例模式使用doublecheck+volatile变量的方式;
    -》如果需要原子特性需要使用Atomic一类对象才能保证原子特性,核心实现是CAS(比较并交换的方式),也就是在JDK的runtime.jar包中的自旋锁来代替sync同步机制。

    CAS缺点:(1)自旋锁的思想是一直循环获取执行机会,虽然减少了线程上下文切换,但比较消耗cpu资源,(2)只能保证一个volatil变量的原子性操作。(3)ABA问题(用时间戳标记)
    CAS核心代码:每次将值替换回主线程内存前先获取,看与之前的值快照是否相同,相同则更新值(更新值的原子性由cpu指令控制,该操作不可被打断),不同则保存新值后在获取,判断是否相同并替换,通过unSafe对象直接获取该值在内存中的offset,底层调用native的方法。

    4·线程不安全集合ArrayList,HashMap,HashSet
    ArrayList:
    (1)Vector (2)Collections.synchronizedList(new ArrayList()) (3)CopyOnWriteArrayList或CopyOnWriteArraySet代替
    (4)ConcurrentHashMap

    锁机制:

    ReentrantLock: (1)默认非公平锁(不按照顺序,抢到者执行) (2)可重入锁(又称为“递归锁”)

    ReentrantReadWriteLock配合lock.newConditon()可以在多个线程间进行等待和唤醒操作。

    ReentrantReadWriteLock能保证读取时并发(可以禁止脏读),写时阻塞读写操作,用于读多写少的情况。分别用读锁和写锁。

    重入锁:当一个被同步标记的方法中调用另一个被标记同步方法,在获取外层锁的同时内层锁也同时获取;
    相当于方法中持有多层lock.lock()和lock.unlock(),也可以同时获得锁;此处lock为同一对象,持有多层lock一定会串行执行。*可重入锁是为了避免程序死锁。

    阻塞队列:

  • 相关阅读:
    pop指令的执行过程
    ipad 4.2 开发环境
    XP远程桌面
    停机问题、哥德尔定理
    看MIT的线性代数
    VizA项目继续推进
    port systemc to mac os x
    关于jar
    普桑
    拉突爾
  • 原文地址:https://www.cnblogs.com/zzq-include/p/10771026.html
Copyright © 2011-2022 走看看