JAVA知识总结(一)

1.乐观锁
CAS是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其他线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。

实现原理:如果内存位置V的值与操作线程预期原值A的值相匹配,那么处理器会自动将该位置更新为新值B,否则处理器将不做任何操作。CAS有效的说明了“我认为该位置应该包含值A,如果包含该值,则将B放到这个位置上,否则,不要更改该位置,只告诉我这个位置现在的值即可” (注:线程预期原值A是上一次操作从预期位置上取出来的)

java.util.concurrent就是建立在CAS之上的

CAS问题: (1).ABA问题:即一个线程把该位置的A改成了B,然后又把B改成了A,此时其他线程访问该位置时会误以为这个位置的值从来没有改变过,会操作成功,实际上这个位置的值改变过了,不应该操作成功。
解决方案:atomic包里提供了一个类AtomicStampedReference来解决ABA的问题:先判断当前引用是否等于预期引用,并且当且标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标记的值设置为给定的新值。

(2).循环时间长,开销大(不成功,就会一直循环执行,直到成功)

CAS(乐观锁)和Synchronized(悲观锁)的使用场景:对于资源竞争较少(线程冲突较轻的情况)使用CAS乐观锁可以获得更高性能,而对于线程冲突严重的情况,CAS自旋概率比较大,从而浪费更多的CPU资源,使用synchronized性能更高。
在jdk1.6以后,Synchronized做了改进,性能已经大大提升了

2.内存分配策略
(1).指针碰撞:这一般适用于内存绝对规整的情况(内存是否规整取决于内存回收策略),分配空间的操作只是将指针向空闲内存一侧移动对象大小的距离即可。
(2).空闲列表:这种适用于内存非规整的情况,这种情况下JVM会维护一个内存列表,记录哪些内存区域是空闲的,大小是多少。给对象分配空间的时候就去空闲列表里去查询到合适的区域进行分配即可。
多线程情况下内存分配方式(1).CAS操作。 (2).TLAB:每个线程在java堆中预先分配一小块内存,称为本地线程分配缓冲区(TLAB),线程内部需要分配内存时直接在TLAB上分配即可,避免了线程冲突,只有当缓冲区的内存用光需要重新分配内存的时候才会进行CAS操作,分配更大的内存空间。

3.HashMap源码分析总结:
(1).HashMap是非线程安全的。
(2).底层是以数组的方式进行存储的,将Key——value键值对作为数组中的一个元素(Map.Entry)进行存储,key,value都是Map.Entry中的属性,数组下标根据key的哈希值和数组长度计算得来。
(3).由于不同的key有可能哈希值相同,即该位置的数组中的元素出现两个以上,那么此时该位置数据元素的存储是用链表的方式进行存储的。如果此位置上的冲突元素个数大于8的时候,此时该位置元素的存储就由链表改变成了红黑树。因为红黑树的查询效率比链表更高效。
(4).HashMap的key,value都可以为null
(5).加载因子:即是用空间达到总空间的(0.75)时,哈希表进行扩容为两倍
(6).删除冲突节点后,hash相同的节点数小于6,红黑树就变成了链表的存储结构。

4.Http2.0优点:
(1).支持使用连接池来降低响应延迟问题
(2).支持响应缓存避免重复的网络请求
(3).支持GZIP压缩,减少了下载文件的大小
(4).支持所有相同域名的请求共享同一个socket

5.线程以及多线程操作知识:
线程的生命周期:New(新建状态)、Runnable(就绪状态)、Running(运行状态)、Block(阻塞状态)、Wait(等待状态)、Dead(终止状态)
New(新建状态):线程对象被创建,但是还没有执行start()方法。

Runnable(就绪状态)线程对象执行了start()方法,但是此线程还没有获得CPU执行时间片段,处于和其他线程竞争获取CPU时间片状态中

Running(运行状态)此时线程获得了CPU执行时间片段,开始执行run方法。

Block(阻塞状态)当多个线程对同步方法或者同步代码块(Synchronized方法或者Synchronized代码块)执行的时候,只有一个线程才能获得锁,获得执行权限,而其他线程会进入到阻塞队列中,此时进入阻塞队列中等待的线程就处于阻塞状态。

Wait(等待状态)当线程执行了sleep(long millisecond)方法后,或者执行了wait()、wait(long millisecond)方法后,线程进入到了等待状态,此时线程让出cpu执行时间片段,让其他线程获得执行的机会。
sleep方法是Thread的静态方法,它不会使线程释放锁,等待时间到了之后,此线程会与其他线程重新竞争时间片段,来执行自身任务。
wait()方法只能在同步方法或者同步方法块中调用,它是Object的普通方法。当它被作为锁的对象调用之后,此线程就会释放该锁,进入到等待状态,只有当其他线程的获得的锁对象执行了notify()、notifyAll()方法之后,此线程才会有可能重新获得该锁,开始继续执行同步代码块中的方法。
wait(long millisecond)它与wait()方法得区别是它会在等待时间结束之后,或者被notify()、notifyAll()唤醒了,才可能重新获得该锁,继续执行同步代码块中的方法。

Dead(终止状态)当线程执行完任务之后,就会进入到终止状态,等待垃圾回收器回收。

wait()、notify()、notifyAll()是Object里面的普通方法,sleep是Thread的静态方法,yield()方法也是Thread的静态方法,join()是Thread的普通方法。
yield():一旦执行,线程会让出当前cpu,再次和相同优先级的线程竞争cpu时间片。它使线程由运行状态进入到了就绪状态,它也不会释放锁。它与sleep的区别是:sleep执行后,优先级低的线程也会得到竞争cpu时间片的机会。

join():假如在A的线程中,线程B对象调用了join方法,那么A会等待线程B执行完之后A才会继续执行下面的任务。

6.垃圾回收机制
垃圾查找算法:(1).引用计数算法:为每个对象添加引用计数器,每被引用一次,计数器+1,失去引用,计数器-1,此对象的引用计数器在一段时间内为0的时候,即认为该对象可以被回收了。但这个算法有个很明显的缺陷是,当两个对象相互引用,但是二者都没有作用的时候,理应把它们回收,但是它们相互引用,不符合垃圾回收的条件,所以就无法处理掉这一块内存区域。因此Sun的JVM并没有采用这种算法。
(2).根搜索算法:从一个叫GC root的根节点出发,向下搜索,如果有对象无法被搜索到的时候,说明该对象不再被引用了,可以被回收了。

垃圾回收算法:(1).复制:复制算法采用的是从根集合进行扫描,将存活的对象移动到一块空闲区域,剩余的垃圾对象进行回收。当存活对象比较少的时候,复制算法比较高效,其带来的成本是需要预先准备一块空闲区域和对象的移动。
(2).标记-清除算法:采用的方式是从根集合开始扫描,对存活对象进行标记,标记完毕后,在扫描整个空间中未被标记的对象,并进行清除。标记-清除动作不需要移动对象,仅对不存活的对象进行清理,在空间中存活对象比较多的时候,效率比较高,但由于只是清理,没有进行重新整理,因此会造成内存碎片。
(3).标记-压缩算法:该算法与标记清除算法类似,都是先对存活对象进行标记,但在清除垃圾对象后会把存活的对象向左端空间移动,然后再更新引用对象的指针。这种算法避免了标记清除算法的内存碎片问题,其成本是移动了对象。

内存分区:新生代、旧生代、持久代。新生代适合生命周期较短,快速创建和销毁的对象。旧生代适合生命周期较长的对象,持久代在Sun虚拟机中就是指方法区。

强引用:在任何时候都不会被回收;
软引用:在内存不足的情况下,才会被回收
弱引用:只要GC,立马回收,不管内存时候充足。

7.JVM内存区域
jvm内存区域主要有:方法区、堆区、虚拟机栈、本地方法栈、程序计数器
方法区和堆区所有线程共享

方法区:方法区存放了要加载的类的信息,比如类名、修饰符、静态变量、构造方法、final定义的常量、类中的字段和方法等信息。在JVM虚拟机中,这块方法对应于持久代。方法区的GC一般是常量池的回收和已加载类的卸载。运行时常量池是方法区的一部分,用于存放编译器生成的常量和引用。

堆区:堆区是GC最频繁的,堆区对所有线程共享,在虚拟机启动的时候创建。堆区主要存放对象实例及数组,所有new出来的对象都存放在该区域。

虚拟机栈:虚拟机栈占用的是操作系统内存,每个线程对应一个虚拟机栈,它是线程私有的。每个方法执行的时候产生一个栈帧,栈帧用于存储局部变量表、动态链接、操作数和方法出口等信息。当方法被调用的时候,栈帧入栈,方法调用结束的时候,栈帧出栈。

本地方法栈:本地方法栈用于支持native方法得执行,存储了每个native方法得执行状态

程序计数器:JVM在解释字节码文件时,存储当前线程执行的字节码行号。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值