Java基础知识三点

1:对象的4种引用:强、软、弱、虚

强引用:如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。如: Myclass my=new MyClass();此时的my对象拥有强引用,不会回收。

软引用:如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它之前,该对象就可以被程序使用。比如说:SoftReference aSoftRef=new SoftReference(aRef);由强引用aRef得到一个软应用,则如果我们令 aRef=null;此时这个对象就只有软应用了。在此后一段时间,如果JVM内存不够用了,就会回收这个对象。但在回收之前,我们仍可以通过这个软引用的get()方法去获取到对象。

弱引用:如果一个对象只具有弱引用,则当GC扫描到该对象时就会回收它,不必等到内存不够时才回收。同样,在回收之前我们也可以通过get()方法获取对象,如果回收之后再调用get()方法就会返回null。

虚引用:如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中,我们通过关联队列就可以知道有哪些对象被垃圾回收器回收了

2:重要关键字

synchronized:可以把任何一个非null 对象 作为"锁",当synchronized作用在方法上时,锁住的便是对象实例(this);当作用在静态方法时锁住的便是对象对应的Class实例,因为 Class数据存在于永久带,因此静态方法锁相当于该类的一个全局锁;当synchronized作用于某一代码域时,锁住的便是对应的代码块。

syncrhoized实现时使用了自旋锁,当一个线程进入竞争队列前,先自旋(等一等看锁会不会释放,一旦释放立刻获得锁对象),自旋期间线程可以做一些无意义的操作来实现暂时占用CPU而不是阻塞。线程自旋超过一定时间还没获得锁,就进入竞争队列被筛选。

transient:Java中一个类在定义时如果实现了Serilizable接口,那么这个类的对象就可以被序列化。(序列化:把对象内容转化为byte数组。反序列化:从byte数组提取信息重构出对象),但是我们考虑到类中的某些重要属性(如:密码)不想被序列化,那么我们可以用transient关键字修饰它。

 

volatile:volatile只能修饰变量,意思是:该变量对于所有线程可见。所有作用在该变量上的操作引起变量的值的变化都会第一时间通知到所有使用它的线程。

          本质:每个线程在使用volatile变量时,如果对变量的值作出了改变,则CPU强制线程立刻把新的值写入主存中。而其他线程在使用到这个变量时,不是从缓存中读取过期值而是直接从主存中读取最新值。

          与syncrhoized比较:比synchronized的使用和执行成本会更低,因为它不会引起线程上下文的切换和调度,也不会引发线程阻塞;volatile仅能实现变量的修改可见性,但不具备原子特性,而synchronized(和lock)则可以保证变量的修改可见性和原子性。(原子性:操作不可被分割执行)

 

3:权限修饰词的修饰作用

private:只在同一类中可见

default:同一类、同一包中可见

protected:在同一类、其子类、同一包中可见

public:对外都可见

原文地址:https://www.cnblogs.com/ygj0930/p/6514114.html