JAvaコアテクノロジーボリューム1

8247 ワード

JAvaコアテクノロジーボリューム1
JAvaベースタイプ
せいけい
データ型
バイト数
値範囲
int
4
+_2^4*8-1
short
2
+_2^2*8-1
long
8
+_2^8*8-1
byte
1
-128-127
 
 
 
浮動小数点の種類
データ型
バイト数
値範囲
小数点以下
float
4
10^-38~10^38と-10^-38~-10^38
小数点6~7
double
4
10^-308~108^308および-10^-308~-10^308
15桁の小数
 
 
 
 
booleanタイプとcharタイプ
JAva文字列
可変文字列
    JVM              ,           ,                      ,       
          。

1、StringBuilder  StringBuffer:StringBuilder:      ,StringBuffer:     。
2、String.intern   

String#internを深く解析する: http://tech.meituan.com/in_depth_understanding_string_intern.html
JAva自動梱包とオブジェクト梱包器
    java             ,    Integer,Long,Double,Short,Float,Byte,Character,Void,Boolean。

JAvaコレクション
  • ArrayList動的配列、動的増加及び縮小インデックスシーケンス
  • LinkedListチェーンテーブルセット、任意の位置で効率的に挿入と削除する秩序シーケンス
  • ArrayDequeがループ配列で実現する両端キュー
  • Hashset重複要素のない無秩序リスト
  • TreeSet(ツリー)
  • EnumSet列挙タイプセット
  • LinkedHashSet秩序化HashSet
  • HashMap辞書
  • TreeMap秩序マッピングテーブル
  • JAva汎用
        java c#  ,        ,       。java      jdk5.0    ,  java     C#           ,          ,java   ArrayList ArrayList      ,           , java        ,          ,  ,                ,  int,    int   Integer  ,            ,           Interger     int   ,     。  c# ,List List      ,               ,      ,            ,          ,             ,          (      ,                       ),         。    ,            int ,       ,            ,  ,    java       。
    java                    :1.                  ,          ,2.            ,      。                 。
    

    JAvaマルチスレッド
    JAvaスレッドのいくつかの状態
  • New(新規作成)
  • Runnable(実行可能)
  • Blocked(ブロック)
  • Waiting(待機)CPU時間を消費しない
  • Timed waiting(タイミング待ち)
  • Terminated(終了)
      BLOCKED           ;WAITING                 (notify),     ,         (RUNNABLE),         ,      (BLOCKED)。
    
    スレッドnewがnewの状態にあり、スレッドがstartメソッドを呼び出し、スレッドがrunnableの状態にあり、スレッドが他のスレッド独占リソースを取得しようとすると、スレッドはblockedブロック状態に入り、スレッドshleepメソッドが呼び出されたり、条件ロックを取得しようとしたりして他のスレッドの起動を待つ(waiting)ステータス.
               ,       ,    Thread.join   ,       ,          。
    
    Thread.stop()メソッドは破棄され、スレッドとサブスレッドを強制的に終了し、データが同期できなかったり、リソースが解放されなかったりするなどの異常が発生する可能性があります.

  • JAvaスレッド優先度
        java                             ,            。
    

    JAvaスレッド同期
                ,java                 。
    
  • ReentrantLockフェアロックのlock()、unlock()メソッドは、コードフラグメントをロックおよびロック解除するために使用される.
  • Condition条件ロック例えば境界バッファの実現:
  •     class BoundedBuffer {  
        final Lock lock = new ReentrantLock();//     
        final Condition notFull  = lock.newCondition();//        
        final Condition notEmpty = lock.newCondition();//        
        
        final Object[] items = new Object[100];//      
        int putptr/*   */, takeptr/*   */, count/*          */;  
        
        public void put(Object x) throws InterruptedException {  
            lock.lock();  
            try {  
            while (count == items.length)//         
                notFull.await();//       
            items[putptr] = x;//     
            if (++putptr == items.length) putptr = 0;//                 ,    0  
            ++count;//  ++  
            notEmpty.signal();//       
            } finally {  
            lock.unlock();  
            }  
        }  
        
        public Object take() throws InterruptedException {  
            lock.lock();  
            try {  
            while (count == 0)//        
                notEmpty.await();//       
            Object x = items[takeptr];//     
            if (++takeptr == items.length) takeptr = 0;//                 ,    0  
            --count;//  --  
            notFull.signal();//       
            return x;  
            } finally {  
            lock.unlock();  
            }  
        }   
        } 
    
  • synchronizedキーワードフェアロックと条件ロックは、java 1.0から各オブジェクトに内部ロックがあり、synchronizedキーワードで同期方法または同期コードブロックを宣言することができます.もちろん、ロックを取得しようとしているスレッドを中断したり、ロックのブロック時間を設定したり、ロックを単一に取得する条件を設定したりするなど、細かい操作能力を提供することはできません.
  • volatileと揮発性構造1、マルチコアプロセッサはレジスタまたはローカルメモリバッファにメモリの値を保存することができ、異なるプロセッサはメモリから異なる値2を読み取ることができ、コンパイラは最適化シーンによって命令の実行順序を変えることができ、コンパイラの偽定メモリの値はメモリを変更する命令の実行を表示する時だけメモリの値が変化する.ただし、別のスレッドがメモリの値を変更している可能性があります.

  • シーンの理解=>java単例モード:
    /**   
    *       Kerrigan         
    */    
    public class SingletonKerriganD {     
        
        /**   
        *          
        */    
        private static SingletonKerriganD instance = null;     
        
        public static SingletonKerriganD getInstance() {     
            if (instance == null) {     
                synchronized (SingletonKerriganD.class) {     
                    if (instance == null) {     
                        instance = new SingletonKerriganD();     
                    }     
                }     
            }     
            return instance;     
        }     
    }    
    
             :        instance = new SingletonKerriganD()  ,         ,              (                    ,         ,             )。                 ,              JVM            ,       8     ,    3   : 
    
    1. Kerrigan       。 
    
    2.   Kerrigan    。
    
    3. instance           (     instance  null )。 
      ,  Java            (out-of-order),  JDK1.5  JMM(Java Memory Medel) Cache、              ,                   ,    ,       1-2-3    1-3-2,     ,   3    、2     ,        ,   instance                ,instance      ,         instance,    ,         ,                               ,         。 
    DCL              、   (    JDK1.4       )      ,          。       (  C  ) DCL    ,        2、3    。 JDK1.5  ,           ,     JMM、    volatile   ,    JDK 1.5      ,    instance     “private volatile static SingletonKerriganD instance = null;”         instance       ,     DCL          。  volatile           ,           JDK1.42       ,                  。 
    
  • 無ロックプログラミング同時環境で最も一般的な同期手段は、pthread_のような反発ロックおよび読み書きロックである.mutexとpthread_readwrite_lock、よく使われるパターンは:
      void ConcurrencyOperation() {
          mutex.lock();
          // do something
          mutex.unlock();
      }
    
    この方法の利点は:1、プログラミングモデルが簡単で、ロックの順序を注意深く制御すれば、一般的にデッドロックの問題はありません;2、ロックの粒度を調節することで性能を調節することができる.

  • 欠点は次のとおりです.
  • ロックベースのアルゴリズムはすべてデッドロックの可能性がある.
  • ロックとロック解除時のプロセスはユーザー状態からカーネル状態に切り替えられ、スレッドのスケジューリング、コンテキスト切替などを伴う可能性があり、オーバーヘッドが比較的重い.
  • 共有データの読み取りと書き込みの間に反発があります.

  • ロックフリープログラミング(厳密には非ブロックプログラミング)はlock freeとwait-freeの2つに分けることができ、以下はそれらの簡単な説明である:lock free:ロックは関係なく、1つのロックに関係のないプログラムは、すべてのスレッドのうち少なくとも1つが下に実行されることを保証することができる.これは、一部のスレッドが任意の遅延を受ける可能性があるが、各ステップにおいて少なくとも1つのスレッドが実行可能であることを意味する.したがって、このシステムは全体として常に前進しているが、一部のスレッドの進捗は他のスレッドが速くない可能性がある.wait free:待機に関係なく、待機に関係のないプログラムは、他のスレッドの相対的な実行速度にかかわらず、限られたステップ内で終了することができます.lock based:ロックベースでは、ロックベースのプログラムは上記の保証を提供することができません.いずれかのスレッドが反発体を持って待機状態にある場合、他の反発体を取得したいスレッドは待機するだけで、ロックベースのアルゴリズムはデッドロックの影から抜け出すことができません.
    lock freeは一般にCAS(Compare And Swap)動作に基づく
    CAS(void *ptr, Any oldValue, Any newValue);
    
           ptr   ,   oldValue     newValue,   true,    false。X86    CAS       CPU CMPXCHG      。CPU            CPU  ,            ,        *ptr  。    CAS   CPU                 。
    

    メリットは次のとおりです.
        :       ,       ;
        :          read+write   ;
             CAS,            ,        。
    

    性能面では、CASとmutex/readwrite lockにはそれぞれ千秋があり、以下のように簡単に説明します.
    単一スレッドでのCASのオーバーヘッドは約10回、mutexのロック解除+ロック解除は約20回、readwrite lockのオーバーヘッドはより大きい.CASの性能は固定値であり、mutexは臨界領域の大きさを変えることで性能を調節することができる.臨界領域における真の修正操作がほんの一部しかない場合,CASを用いてより大きな同時性を得ることができる.マルチコアCPUではスレッドスケジューリングのコストが高く、CASが適しています.
    ロックフリープログラミングはまた、ロック範囲を減らすなどの方法でロックフリーまたは軽量レベルのロックメカニズムを実現することもできます.java CurrenHhashMap実装を参照してください.
    http://blog.csdn.net/kjfcpua/article/details/11937817
  • スレッド割込みjavaにはinterruptメソッド割込みスレッドが提供されており、スレッド割込みは実際にはCPU実行タイムスライスを剥がして取得したCPU割込みではなく、スレッドが割込み論理を処理すべきであることを示す通知メカニズムを提供する.
  • スレッドプール
  • JAvaスレッドプール作成構文:
    ExecutorService threadPool = Executors.newFixedThreadPool(3)
    

    java JVM,GC
    java NIO,netty
    転載先:https://www.cnblogs.com/LiJianBlog/p/5922485.html