Javaの誘導の中級知識(IV)

シックスティーン、Javaのメモリモデル

  特徴:アトム、可視性、秩序あります。

  アトミック:、読ん負荷、使用、保存、書き込み、synchronizedキーワードアトミック性を確保するために

  可視性:同期、揮発性、最終的には、視認性を確保します

  注文:秩序を確保するための同期

XVIIのデザインパターン

  ① カテゴリー

    :タイプモード(5)を作成しますファクトリメソッドモデル、抽象工場モード、シングルモードで、Builderパターン、プロトタイプモデルを

    構造モード(7つのタイプ):アダプタモード、装飾モード、プロキシモード、外観モード、ブリッジモード、組み合わせモード、フライ。

    行動パターン(11種類):戦略モード、テンプレートメソッドパターン、観察モード、イテレータパターン、責任の連鎖モード、コマンドモード、メモモード状態モード、ビジターパターン、仲介モデルモードを説明します。

    その他:同時実行パターンとスレッドプールモード。

  ② デザインパターン6つの原則

    オープンクローズ原理(オープンクローズ原理):開閉拡張のために開かれている原理を、しかし、修正のため閉鎖。プログラムを展開する必要がある場合は、ホットスワップ可能なの効果を達成するために、既存のコードを変更しません。すべて一つの文章にまとめ:プログラムの拡張を維持し、アップグレードが良い、簡単にするために。この効果を達成したい、我々はインターフェースと抽象クラスを使用する必要があります。

    (と略すリスコフの置換原則、:LSP):リヒター置換原則オブジェクト指向設計の基本原則の一つ。任意の基底クラスが表示されることができる場所でリヒターの置換原則、サブクラスが表示されることができるようになります。LSPは、派生クラスが基本クラスを置き換えることができた場合にのみ、機能のソフトウェアユニットは影響を受けません礎石は、基底クラスが実際に再利用できる多重化継承され、派生クラスは、基本クラスに基づいて新しい動作を追加することができます。リヒターの置換原則がある - 「オン - オフ」の原則を追加します。原則として抽象化における重要なステップである - 「閉じオープンは」達成するために。基底クラスとの継承関係は、抽象的、具体的な実現のサブクラスなので、リヒターの置換原則は、抽象を達成するための具体的な手順については、仕様です。

    依存性逆転原理(依存性逆転原理):これは開閉の原理に基づいて、特定のコンテンツである:インターフェイスプログラミングのために、抽象的ではなく具体的​​に依存することに依存します。

    界面分離原理(界面偏析原理):インターフェース分離複数の、単一のインターフェースを使用するよりも優れている。この原理の意味があることです。またはクラス間の結合度が低いの意味、ここから私たちは、実際には、デザインパターンをアップグレードするためとメンテナンスが容易で、大規模なソフトウェアアーキテクチャをトリガーから設計ソフトウェアである、ことを参照してください。したがって、上記複数回:結合を低減、依存性を低減します。

    デメテル(既知の最小原理)(デメテル原理)、すなわちなぜ少なくとも既知の原理を呼び出す:エンティティがエンティティ及び他の、そのようなその独立した機能モジュール間の相互作用を最小限にすべきです。

    多重化の原則(コンポジットリユース原理)の合成:原理は、合成ポリマーの情報/代わりの継承を使用することです。

十八、Javaリフレクション(フォーカス)

  リフレクションは、実行時に情報を取得できるプログラム自体を指します。

  なぜリフレクションを使うのか?直接ではなく、動的および静的な概念を伴う、まだその上にオブジェクトを作成します。

    静的にコンパイル:すなわちを通じて、オブジェクトを結合、コンパイル時の型で決定。

    動的コンパイル:オブジェクトを結合、実行しているのタイプを決定します。ジャワの動的コンパイルの柔軟性を最大化するために、多型は、クラス間の結合を低減するために、アプリケーションを反映しています。

  言葉の利点は、反射を使用すると、特にその柔軟性にJ2EEの開発に、非常に大きな柔軟性を反映して、オブジェクトおよび動的コンパイルを作成することができ非常に明白であったとということです。

  役割:①最初の着信クラスのフルネームに応じClassオブジェクトを作成する必要があります。②利用できるメソッドクラスのメソッド。クラス属性を取得する③方法。

  不利な点:最初の性能①:反射器はダイナミック型の数を含む、JVMは、コードを最適化することができません。したがって、操作の効率は、非反射アクションのものよりはるかに低い反射しました。私たちは、プログラムの反射頻繁に実行されるコードや、高パフォーマンスの要件の使用を避けるべきです。②セキュリティ制限:プログラムの反射技術要件の使用が制限された環境で実行する必要があり安全ではありません。プログラムはアプレットとして、セキュリティ制限のある環境で実行する必要があります。内部暴露③:反射コードは(例えばプライベート属性およびメソッドへのアクセスのような)通常の条件下で、いくつかの操作を実行することが許可されていない可能ので、反射の使用は予期しない副作用を引き起こす可能性が - コードエラー関数に減少移植。それは抽象反射コードを破壊するので、プラットフォームが変更された場合、コードの挙動、またそこに変化してもよいです。

十九、Javaのリファレンス

 

①私たちは、この単純な関数で次の文を書いたとします:

 

StringBufferの列str =新しいStringBufferの( "こんにちは、世界"); 

 

この文は単純ですが、実際には、それは次の3つのステップが含まれています。

 

それらに優れたStringBufferオブジェクトを作成するためのアプリケーション・ヒープ・メモリクックまず、新しいのStringBuffer(「Hello World」の)、。第二に、StringBufferの列strはポインタを宣言します。ポインタ自体は、(関数内の文を書いたように)、スタックに格納されたStringBuffer型のオブジェクトを指すように使用することができます。それとも、このポインタは、StringBufferオブジェクトのアドレスを格納するために使用することができ、別の言い方をします。2つを関連付けるために(割り当て)数に等しいメモリアドレスの最後の塊を、保存、それはちょうどSTRの値は、完全な基準に適用することです。

 

②final定数問題

 

针对引用类型变量的final修饰符也是很多人搞混淆的地方。实际上final只是修饰指针的值(也就是限定指针保存的地址不能变)。至于该指针指向的对象,内容是否能变,那就管不着了。所以,对于如下语句:

 

final StringBuffer strConst = new StringBuffer();

 

你可以修改它指向的对象的内容,比如:

 

strConst.append(" ");

 

但是不能修改它的值,比如:

 

strConst = null;

 

③传参的问题:

 

例如:System.out.println(str);这个语句又是什么意思捏?这时候就两说了。

 

第一种理解:可以认为传进函数的是str这个指针,指针说白了就是一个地址的值,说得再白一点,就是个整数。按照这种理解,就是传值的方式。也就是说,参数传递的是指针本身,所以是传值的。

 

第二种理解:可以认为传进去的是StringBuffer对象,按照这种理解,就是传引用方式了。因为我们确实是把对象的地址(也就是引用)给传了进去。

二十、线程、线程池

 

①创建线程有两种方式:继承Thread或实现Runnable。Thread实现了Runnable接口,提供了一个空的run()方法,所以不论是继承Thread还是实现Runnable,都要有自己的run()方法。一个线程创建后就存在,调用start()方法就开始运行(执行run()方法),调用wait进入等待或调用sleep进入休眠期,顺利运行完毕或休眠被中断或运行过程中出现异常而退出。

 

②wait和sleep比较:sleep方法有:sleep(long millis),sleep(long millis, long nanos),调用sleep方法后,当前线程进入休眠期,暂停执行,但该线程继续拥有监视资源的所有权。到达休眠时间后线程将继续执行,直到完成。若在休眠期另一线程中断该线程,则该线程退出。等待有其它的线程调用notify()或notifyAll()进入调度状态,与其它线程共同争夺监视。

 

③线程池:多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。一个线程池包括以下四个基本组成部分:

 

A、线程池管理器(ThreadPool):用于创建并管理线程池,包括创建线程池,销毁线程池,添加新任务;

 

B、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;

 

C、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;

 

D、任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。

 

④线程池分类:

 

A、newFixedThreadPool  创建一个指定工作线程数量的线程池。

 

每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。

 

B、newCachedThreadPool创建一个可缓存的线程池。

 

这种类型的线程池特点是:

 

1).工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger.MAX_VALUE), 这样可灵活的往线程池中添加线程。

 

2).如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。

 

C、newSingleThreadExecutor创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,如果这个线程异常结束,会有另一个取代它,保证顺序执行(我觉得这点是它的特色)。

 

单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。

 

D、newScheduleThreadPool  创建一个定长的线程池,而且支持定时的以及周期性的任务执行,类似于Timer。

 

⑤Executors类,提供了一系列静态工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。

 

⑥线程池参数:

 

A、corePoolSize(线程池的基本大小)

 

B、runnableTaskQueue(任务队列):用于保存等待执行的任务的阻塞队列。

 

1)LinkedBlockingQueue:一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列。

 

2)SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列。

 

3)PriorityBlockingQueue:一个具有优先级的无限阻塞队列。

 

C、maximumPoolSize(线程池最大大小):线程池允许创建的最大线程数。

 

D、ThreadFactory:用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程设置更有意义的名字。

 

E、RejectedExecutionHandler(饱和策略):当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常。以下是JDK1.5提供的四种策略:

 

1)AbortPolicy:直接抛出异常。

 

2)CallerRunsPolicy:只用调用者所在线程来运行任务。

 

3)DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务。

 

4)DiscardPolicy:不处理,丢弃掉。

 

5)当然也可以根据应用场景需要来实现RejectedExecutionHandler接口自定义策略。如记录日志或持久化不能处理的任务。

 

F、keepAliveTime(线程活动保持时间):线程池的工作线程空闲后,保持存活的时间。所以如果任务很多,并且每个任务执行的时间比较短,可以调大这个时间,提高线程的利用率。

 

G、TimeUnit(线程活动保持时间的单位):可选的单位有天(DAYS),小时(HOURS),分钟(MINUTES),毫秒(MILLISECONDS),微秒(MICROSECONDS, 千分之一毫秒)和毫微秒(NANOSECONDS, 千分之一微秒)。

 

 

    

 

おすすめ

転載: www.cnblogs.com/tizer/p/11361333.html