Java基础总结【过于精简】

# 总结:
##  1 violate
   ### 高速缓存(指令加减) - 主存
  硬件上:
  总线锁
  缓存一致性协议
### 并发编程
原子性 【高,低位操作】
可见性 【对于共享变量:一个线程改了,另外一个线程不能及时看到】
有序性【处理器会指令重排】
### Java内存模型
线程1->线程1工作内存 <->主存 <->线程2工作内存<-线程2
原子性:只有简单的读取、赋值(而且必须是将数字赋值给某个变量,变量之间的相互赋值不是原子操作)才是原子操作。
可见性:violate
有序性:happens-before原则推导
##2 java多线程
### 线程使用方式
1. 继承Thread
2. 实现Runnable【每个线程都是用同一个实例化对象来new,达到共享资源】
### 线程的状态
1. new 处理
2. Runnable. 【执行start】
3. Running 【获得cpu】
4. Blocked
a.等待阻塞:wait
b.同步阻塞,在获取对象锁时
c. 其他阻塞:运行的线程执行sleep()或join()方法
  5. Dead:运行结束
### 常用函数
Sleep:使当前线程进入停滞状态(阻塞当前线程),让出Cpu的使用


Join :等待线程终止


yield:让当前运行线程回到可运行状态
   sleep()和yield()的区别):sleep()使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会被执行;yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。


Interrupt():中断某个线程,这种结束方式比较粗暴,如果t线程打开了某个资源还没来得及关闭也就是run方法还没有执行完就强制结束线程,会导致资源无法关闭。InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException 。


wait()Obj.wait(),与Obj.notify()必须要与synchronized(Obj)一起使用,也就是wait,与notify是针对已经获取了Obj锁进行操作,从语法角度来说就是Obj.wait(),Obj.notify必须在synchronized(Obj)语句块内。
### 其他:
后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束
不可变对象:
immutable Objects就是那些一旦被创建,它们的状态就不能被改变的Objects,每次对他们的改变都是产生了新的immutable的对象,而mutable Objects就是那些创建后,状态可以被改变的Objects.举个例子:String和StringBuilder,String是immutable的
如何创建不可变对象
1)immutable对象的状态在创建之后就不能发生改变,任何对它的改变都应该产生一个新的对象。
2)Immutable类的所有的属性都应该是final的。
3)对象必须被正确的创建,比如:对象引用在对象创建过程中不能泄露(leak)。4)对象应该是final的,以此来限制子类继承父类,以避免子类改变了父类的immutable特性。
5)如果类中包含mutable类对象,那么返回给客户端的时候,返回该对象的一个拷贝,而不是该对象本身(该条可以归为第一条中的一个特例)
### synchronized关键字
synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)身上。


a. 无论synchronized关键字加在方法上还是对象上,_它取得的锁都是对象_,而不是把一段代码或函数当作锁
b.每个对象只有一个锁(lock)与之相关联。
c. 把class作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类
##3 Clone和Serializable
##4 equal和==
1. 他们比较的不是对象中字段的值或者说本身对象的值,而比较的是物理地址。
2. 在String中 equals方法被重写 当物理地址不同时,会进一步比较值
3. 那么为了保证两个对象比较值相等有什么办法么?想必大家都试过重写equals方法,而最终的结果都不如人意。为什么?因为单单重写equals方法并不能改变hashcode值,在java中 首先比较的就是hashcode。
##5 hashcode和equal
   所有对于需要大量并且快速的对比的话如果都用equal()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!
   这种大量的并且快速的对象对比一般使用的hash容器中,比如hashset,hashmap,hashtable等等,比如hashset里要求对象不能重复,则他内部必然要对添加进去的每个对象进行对比,而他的对比规则就是像上面说的那样,先hashCode(),如果hashCode()相同,再用equal()验证,如果hashCode()都不同,则肯定不同,这样对比的效率就很高了。
         1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。
         2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
为什么重写equal时需要先重写hashcode:
因为Object里hashCode()里面只是返回当前对象的地址,如果是这样的话,那么我们相同的一个类,new两个对象,由于他们在内存里的地址不同,则他们的hashCode()不同。
##6 StrongReference,WeakReference ,SoftReference
StrongReference:
a = new Object() 这个new Object()取名叫x
c = a
a = null
c == x
WeakReference:
a = new Object() 这个new Object()取名叫x
弱引用 c = a
a = null
c == null 上面这个x被GC了
SoftReference:
不会直接GC,或在JVM没有空间的时候才GC
##7 java error和exception ,RuntimeException和非RuntimeException
###异常的分类:
① 异常的继承结构:基类为_Throwable_,_Error_和_Exception_继承Throwable,_RuntimeException_和_IOException_等继承_Exception_,具体的RuntimeException继承RuntimeException。 
② Error和RuntimeException及其子类成为未检查异常(_unchecked_),其它异常成为已检查异常(_checked_)。


###每个类型的异常的特点 
Error体系 :
Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形。应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出)。如果出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以,在进行程序设计时,应该更关注Exception体系。_程序中无法捕获_


Exception体系包括RuntimeException体系和其他非RuntimeException的体系:
_程序中可以try catch_
① RuntimeException:RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。 


②其他非RuntimeException(IOException等等):这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。
##8集合.Collection接口
###Collection集合
从逻辑角度分为:Set【不重复组】、List【有序可重复组_下标读取_】和Map【key-value组】
从存储角度分为:Hash   Link(数组)   Array(链表)
从是否线程安全角度:安全的(Vector)不安全的(ArrayList)
继承结构:(img)
策略选择:
数组实现;随机访问速度还行,插入、删除、迭代操作速度一般。
链表实现;随机访问速度不太好,插入、删除、迭代速度非常快。
###集合排序
List<Student> list = new ArrayList<Student>();
1.  Collections.sort(list)方式排序
Student需要重写了_Comparable_接口的_compareTo_()
2. Collections.sort(list, new StudentComparator()) 方式排序
需要StudentComparator实现_Comparator_接口,泛型为Student,重写_compare_方法
##9Mysql隔离级别
_叫法_ 脏读          不可重复读          幻读
Read uncommitted          y                    y                       y
Read committed                n                    y                       y
Repeatable Read               n                    n                       y
Serializable                        n                    n                       n
_从叫法这一列考虑问题_
Read uncommitted/直接写磁盘/ ->提供提交后再写入磁盘 -> Read committed 
Read committed -> A事务开始,B事务开始,A结束时修改块1,这个时候把1的原始块保存起来供B使用。B结束。-> Repeatable Read /mysql默认级别/
Repeatable Read ->锁表 -> Serializable
##JavaGC
Stop-the-world意味着 JVM 因为要执行GC而停止了应用程序的执行。
新生代【 3个窗口】 -> 老年代  持久代【方法和常量】
或者 如G1算法的矩阵块结构
###A:新生代中,每个窗口满了后会发生GC【minor GC】,会将存活的数据后移到下一个窗口,直到进入老年代
###B:老年代GC五种类型:
. _Serial GC_  【mark标记过期-sweep清理过期-_compact压缩未用空间(对堆进行压缩,使堆内空间连续)_】有点像磁盘整理,这个方式不应使用。
. _Parallel GC _【发展为多线程GC】
. _Parallel Old GC_ (Parallel Compacting GC) 
【mark – summary – compaction  jdk5后出现】
 summary步骤与清理sweep的不同之处在于,其将依然幸存的对象分发到GC预先处理好的不同区域,算法相对清理来说略微复杂一点
mark – summary – compaction
. _Concurrent Mark & Sweep GC  (or “CMS”)_
【init mark;并行mark;remark;并行sweep】
优点stop时间短: 
1采用先mark最新的一部分【stop-world】,然后在和java  进程同步执行的时候mark另外一部分【被第一次标记所引用的对象】,最后再remark一次【stop-world】。
2 sweep的时候,不中断java进程
缺点:
占用cpu
默认不支持压缩,也就是它需要更大的堆空间
. _Garbage First (G1) GC_
矩阵块结构
每个对象被分配到矩阵块中不同的格子,随后GC执行。当一个格子装满之后,对象被分配到另一个区域,并执行GC。
###C如何监控?
jstat
##JVM机制( 未完成)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值