java高級

day01
  1.Lambada表達式:在JavaSE8中出現的新特性,用於將大量代碼塊簡便引用
    口訣:拷貝小括號 寫死右箭頭 落地大括號
    ()->{}
  2.Lock鎖:和Synchronized的做用一致
  不一樣處:Lock是在Java接口層面的一個接口,能夠爲多個類提供鎖機制mysql

    Lock lock = new ReentrantLock();算法

day02sql

    多線程口訣:操做,線程,資源類數據庫

  ArrayList:線程不安全,擴容時須要擴1.5倍,在高併發時容易發生Java.util.ConcurrentModifictaionExcepiton。通常使用CopyOnWriteArraylist來解決併發問題
  HashSet:底層原理HashMap.線程不安全,在高併發時容易發生Java.util.ConcurrentModificationException,通常使用CopyOnWriteArraySet來解決問題。
  HashMap:在高併發時容易實現Java.Util.ConcurrentModificationExcaption的異常,解決方法:使用ConcurrentHashMap便可解決問題。
    解決高併發的問題:
  1.Vector list = new Vector();
  2.List list = Collections.synchronizedList(new ArrayList());
  3.CopyOnWriteArraylist list = new CopyOnWriteArraylist();數組

CopyOnWriteArraylist的原理解釋:實現了讀寫分離,寫時複製的原理
  在往一個容器裏添加元素的時候,不直接往當前容器的Object[]添加,而是先將該容器複製一份,當作Object[] newElements,而後往新的容器裏添加東西,添加完以後,在將原容器的引用指向新的容器,從而實現對容器進行讀取。這是一種讀寫分離的思想。。。適合讀多寫少的場景
在CopyOnWriteArrayList中,初始化過程當中會建立一個數組。數組的長度爲0;new Object[0]
  源碼以下:
  public boolean add(E e)
    {
      final ReentrantLock lock = this.lock;安全

      lock.lock();數據結構

    try{
      Object[] ele ments = getArray();
      int len = elements.length;
      Object[] newElements = Arrays.copyOf(elements, len + 1);
      newElements[len] = e;
      setArray(newElements);
      return true;
  }
    finally {
      lock.unlock();
      }
    }
synchroized鎖機制:
  1.一個對象裏面有多個synchronized方法時,當一個線程進行調用時,其餘線程不能進入,只能在外面等待
  synchronized鎖的是當前的對象,並不是只是該方法。
  2.在多線程併發裏面添加一個普通的方法與synchronized的方法毫無影響。
  3.全部的靜態同步方法用的也是同一把鎖——類對象自己,就是咱們說過的惟一模板Class,具體實例對象this和惟一模板Class,這兩把鎖是兩個不一樣的對象,因此靜態同步方法與普通同步方法之間是不會有競態條件的。可是一旦一個靜態同步方法獲取鎖後,其餘的靜態同步方法都必須等待該方法釋放鎖後才能獲取鎖,
多線程的方法:判斷/幹活/通知 , 在多線程的互相交互中,爲了使交互過程當中不出現虛假喚醒現象,則不能使用if進行判斷,要使用while進行判斷。
令:若是有兩個線程A,B 則線程的選擇非A即B ,所以在線程的互相交換中。不會有其餘的線程進行干擾。而若是增長線程數,增長到4個,則四個線程的交互過程可能會出現互相爭搶資源的狀況發生,勢必會形成線程的紊亂。所以在線程的交互過程當中,
  **若是使用的是Lock加鎖並不是synchronized要使用:
    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();
    Condition的形式進行對應的等待機制和喚醒機制的體現,
      condition.await();
      condition.singalAll();喚醒所有
      condition.singal();喚醒單個
  **若是使用的是synchronized加鎖,則須要使用
      this.wait();
      this.nitifyAll();多線程

day03併發

  1.ReentrantReadWriteLock();讀寫鎖機制
    在讀取與寫入時,讀操做容許併發操做,可是寫操做並不容許併發操做,因此須要給資源類加鎖.
通常會加一個lock的鎖與一個解鎖, 可是在運行過程當中,雖然能夠精確的控制寫操做的併發操做,可是同時也限制了讀操做的 併發操做。這並不符合咱們的設想,因而爲了給讀和寫分別加上不一樣的鎖,
咱們引入了ReentrantReadWriteLock的鎖機制,他能夠限制寫操做的併發,可是並未限制讀操做的併發操做
  2.CountDownLatch:CountDownLatch是一個同步工具類,它容許一個或多個線程一直等待,直到其餘線程執行完後再執行。
    能夠等待其餘的線程執行完畢後進行執行
  3.CyclicBarrier:也是一個同步工具類。他在等待全部的代碼執行完畢以後再執行代碼。
  4.Semaphore是一種在多線程環境下使用的設施,該設施負責協調各個線程,以保證它們可以正確、合理的使用公共資源的設施,也是操做系統中用於控制進程同步互斥的量。
    void acquire():今後信號量獲取一個許可前線程將一直阻塞。至關於一輛車佔了一個車位。jvm

    void release(int n):釋放n個許可。
  5.得到多線程的方法:
    1)實現runnable接口方法
    2)繼承Thread類
    3)實現Callable接口(與runnable接口的方法不一樣之處在於,①.Callable能夠接收返回值②落地的實現方法有區別③Callable能夠拋異常)
    4)線程池技術
  6.BlockingQueue
    1)ArrayBlockingQueue: ArrayBlockQueue:一個由數組支持的有界阻塞隊列。按 FIFO(先進先出)原則對元素進行排序,建立時必須明確大小。
    2)該方法具備多個添加以及取出元素的方法
      a)add添加方法,對應remove的移除方法。該方法若是在沒有值時進取值運算的話,會報異常,碰到其餘的信息也會報相關的異常
      b)offer添加方法,對應poll的移除方法,該方法若是出現上述狀況的話,沒有值不會包異常,直接返回null,添加成功的話就顯示true,失敗就顯示false。
      c)put 添加方法,對應take移除方法, 該方法若是也有上述狀況出現的話,就直接堵塞
  7.ExecutorService。線程池技術
    a)通常不多用其餘兩種的線程方法,FixedThreadPool和SinglThreadPool由於容許的建立的數量過大,會致使OOM
      CacheThreadPool和ScheuledThreadPool容許的線程數量太多,會致使OOM
    b)通常都採用自定義線程池
      ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(


  int corePoolSize,//常駐的線程
  int maximumPoolSize,//最大的線程數

  long keepAliveTime,//除了常駐線程之外的存活時間

  TimeUnit unit,//存活時間的單位

  BlockingQueue<Runnable> workQueue,//阻塞隊列

  ThreadFactory threadFactory,//線程工廠

  RejectedExecutionHandler handler//拒絕策略

    //將以上的參數進行設置,就是在設置池中參數的信息

  );

      executorService.execute(()->{
    System.out.println(Thread.currentThread().getName()+"辦理業務");
  } );

  利用Lambada表達式技術,調用所須要的線程
    8.爲何須要使用condition來實現lock能夠實現的功能
之前的方式只能一個等待隊列,在實際應用時可能須要多個,好比讀和寫。爲了這個靈活性,lock將同步互斥控制和等待隊列分離開來,互斥保證在某個時刻只有一個線程訪問臨界區(lock本身完成),等待隊列負責保存被阻塞的線程(condition完成)。

day04
  1.類加載器(作的工做至關於快遞員的工做,將class字節碼文件加載到內存中去,並將這些內容轉化爲方法區中的運行時數據結構,而且ClassLoader類加載器只負責將class文件進行加載,至因而否能夠運行取決於(Execution Engine執行引擎))
類加載器一共有四種分別是:
    a) Bootstrap類啓動類加載器(全部Java自帶的類存放在rt.jar包中) :屬於根加載器,即從Java誕生之日起,全部的原廠類都在這裏進行加載
    b) Extension擴展類加載器 :在Java發展了多年之後發現須要進行擴展,因此就誕生了擴展類加載器
    c) AppClassLoader應用程序類加載器 :用戶本身寫的類,用該類加載器進行加載
    d) 用戶自定義加載器 :不多使用
  2.雙親委派機制
    當一個類在收到類加載請求時,他本身首先不會對類進行加載,而是調用父類的方法進行調用查詢是否已經對該方法進行了調用,若是在父類中查到了就繼續將該類進行加載,若是沒有找到該類就繼續向上調用方法查詢是否已經對該方法進行了調用,在頂端父類中若是找到了,就對該類進行加載,若是找不到,子類加載器才嘗試去加載

  3.NativeInterface:本地接口
    由於Java語言的有些部分沒法借用c語言,只可以引用,因此有一個本地庫,用來引用c的一些源碼
  4.程序計數器
    每一個線程中都有一個程序計數器,程序計數器是線程私有的,他的做用是用來存儲指向下一條指令的地址
  5.棧
    棧也叫棧內存,用於Java程序的執行。每當一個線程建立時就會生成一個棧內存,當線程毀滅時棧內存也跟着毀滅,不存在垃圾回收機制
  棧內存的運用原理:每當一個方法被調用時就會產生一個棧幀,棧幀的順序是,先入後出,後入先出。若是棧的內存被存滿以後就會報出異常
    Java.lang.StackOverFlowError
  6.方法區是用來加載模板類的(.Class)也是共有的,並不是私有的
  7.堆內存
    堆內存分爲三部分:年輕代,老年代,永久代
    新生區(伊甸區,倖存1區,倖存2區),養老區,永久存儲區

day 05
  1.GC(分代收集算法)
    a)頻繁收集新生代
    b)較少收集老年代
  GC通常分爲兩種:
    a)minorGC:主要是針對新生代的Java對象進行GC,很頻繁,由於Java對象通常都出如今新生代
    b)majorGC主要是針對老年代進行GC 不頻繁
  2.GC的四大算法:

2019-10-21 18:47:13 如何判斷對象依舊存活:可達性分析算法:基本思想是經過一系列稱爲「GC Root」的對象(如系統類加載器、棧中的對象、
  處於激活狀態的線程等)做爲起點,基於對象引用關係,開始向下搜索,所走過的路徑稱爲引用鏈,當一個對象到
  GC Root沒有任何引用鏈相連,證實對象是不可用的。

 

 

 

 

    1).引用計數法 通常不使用
    2).Copying算法 因爲內存的緣由 HpotJVM通常新生代分爲三個部分 伊甸園區 倖存1區 倖存2 區 比例爲8;1;1 在第一次GC時 ,將伊甸區存活的對象進行copy到To區,而在FROM區中,存活的對象依然根據本身的時間長短進行判斷,若是達到15,就能夠到養老區,若是沒有到15 的話,就複製到To區進行等待,(這時全部的對象已經都在To區內了)。將To區與FROM區進行copy,保證了全部的對象都在FROM區內
    缺點:  a)浪費了50%的空間
           b)要保證新生區的存活率很低
    3).標記清除算法 通常用於老年區 , 分爲兩個部分一是標記部分 並且標記部分須要中止程序的運行過程,也須要掃描整個區
二是清除完的對象不必定是連續的,若是在從新分配空間時,不給分配連續的內存空間,則會顯得不規整,因此jvm須要爲他們找到連續的內存空間,費時費力 並且會產生碎片
    4).標記清除壓縮:在上一個方法的基礎上進行了對應的提高,不須要jvm再尋找連續的內存空間,直接進行滑動便可,jvm只須要擁有一個內存的起始點便可
  3.MySql的隔離機制
    Read Uncmmitted(未提交的讀取):
    Read committed(已提交的讀取):
    Repeatable Read(可重複讀取):
    Seriazialiable(實現序列化):

day06 Mysql高級
  1.索引:在數據以外,數據庫系統還維護着知足特定算法查詢數據的方法,便是索引,索引是一種用來查詢數據的數據結構
  2.如何高效的查詢數據的算法結構
    方法一:利用所有遍歷的方法來查詢,效率過低
    方法二:高速查詢的兩種方法
      a)利用Hash值來進行查詢,由於hash值的惟一性,因此在進行crud等操做時都有着良好的表現,可是一旦要進行批量的查詢數據,例如模糊查詢,就會顯示出該方法的一種劣勢,由於他的hash值是惟一的,因此在進行批量查詢時,反而比較麻煩他的總體平均時間複雜度會由O(1)升爲O(n)
      b)利用樹結構進行查詢的話,能夠方便許多,避免了上面的問題的出現,他的平均時間複雜度會變爲O(log2N)
  注:Innodb並不支持Hash索引
  3.平衡二叉樹:由於普通的二叉樹可能會產生一種一遍傾倒的現象,所以出現了平均二叉樹,解決了上述問題。
    缺點:因爲會產生較高的樹長,因此會在磁道上面留下許多IO,這樣很不利於磁道的工做。
  4.BTree的工做原理(2-3樹):容許每一個磁盤塊上(每一個節點上)有兩個升序排列的關鍵字,三個用來存放下一個子節點的地址指針,在查找時,經過每一次的在磁塊上的操做,

 


day07
  1.Mysql的高級索引結構
    單值索引:即一個索引只包含一個列,而一個表能夠有多個單列索引
    惟一索引:索引列的值必須惟一,可是能夠爲空
    複合索引:即一個索引能夠包含多個列
  2.在mysql中使用的引擎爲Innodb
  3.mysql中經常使用的七種join語句分別爲:
    a)內鏈接:select * from A inner join B where A.id=B.id用來查詢兩個表中的公共部分
    b)左外鏈接:select * from A left join B on A.id=B.id 將左表 當作主表 查詢左邊表的獨有部分和兩個表的公共部分
    c)右外鏈接:select * from A right join B on A.id=B.id將右表 當作主表 查詢右邊表的獨有部分和兩個表的公共部分
    d)A的獨有部分的查詢:select * from A left join B on A.id=B.id where B.id is null;
    e)B 的獨有部分:select * from A left join B on A.id=B.id where A.id is null;
    f)全查詢:兩個表的全部部分都進行查詢,在mysql中並不支持full的所有查詢表,因此只能使用union的鏈接方法進行查詢的鏈接

        SELECT * FROM tbl_emp A LEFT JOIN tbl_dept B ON A.deptId = B.id
        UNION
        SELECT * FROM tbl_emp A RIGHT JOIN tbl_dept B ON A.deptId = B.id

  4.索引與數據查詢分析

    索引解釋:至關於將數據提早取出來放在一個固定的位置,方便了取數據。mysql 的索引結構是B+樹

  5.建立索引的方法:CREATE [UNIQUE ] INDEX indexName ON mytable(columnname(length));

    ALTER TABLE 表名 ADD [UNIQUE ] INDEX [indexName] ON (columnname(length))

    在優化mysql的過程當中,由許多的參數須要進行優化:

      a) id:用來表示mysql執行過程當中的語句執行過程

        1)id不一樣的話,id越大則越早執行

        2)id相同的話,則從上到下執行

      b) select-type:行 查詢的類型,主要是用於區別普通查詢,聯合查詢,子查詢等複雜查詢

      c) table:表示當前查詢的屬於哪一張表的

      d) type表示訪問類型:通常來講用【system>const>eq_ref>ref>range>index>All】在平時的工做中能夠達到ref級別已經很是不錯了

 

 

 

      e) possiables_keys:可能用到的索引,一個或者多個,可是不必定使用,

      f) key:表示已經使用了的索引,若是該項爲null,則說明並未使用索引,若是使用了索引覆蓋,則該項的值與select的值相同。

      g) ket_len:表示索引使用的字節數,在不丟失精度的狀況下,長度越小越好。

      h) ref顯示索引的哪一列被引用了。

      j) rows 根據表統計信息及索引用狀況,大體估算出找到所需的記錄所須要讀取的行數

 

Condition

  1.Condition 接口描述了可能會與鎖有關聯的條件變量。這些變量在用 法上與使用 Object.wait 訪問的隱式監視器相似,但提供了更強大的 功能。須要特別指出的是,單個 Lock 可能與多個 Condition 對象關 聯。爲了不兼容性問題,Condition 方法的名稱與對應的 Object 版 本中的不一樣。

  2.在 Condition 對象中,與 wait、notify 和 notifyAll 方法對應的分別是 await、signal 和 signalAll。

  3.Condition 實例實質上被綁定到一個鎖上。要爲特定 Lock 實例得到 Condition 實例,請使用其 newCondition() 方法。

相關文章
相關標籤/搜索