どのように体系的にJavaの並行処理技術を学ぶことができますか?

Javaは、Javaプログラマが理解しなければならない並行プログラミングされているが、技術的な内容を理解することは困難です。

ここで、簡単なマルチスレッドプログラミング、またはjucのクラスの使用の使用を意味するだけでなく。もちろん、これらは並行プログラミングの基本です、これらのツールを使用することに加えて、関連するJavaの並行プログラミング技術の原理は非常に豊富です。知識のシステムの同時形成をより良くするためには、私は現在、このような記事を書くので、いくつかの並行プログラミングの専門家のブログや書籍を参照して、簡単な仕上げを行うには能力を持っていないことを考えます。

いくつかの方法についての最初の話は、私はJavaの並行プログラミングにそれを学びます。これは、おおよそのステップに分かれています。


1は、最初のようにThreadクラスを使用して、最も基本的なJavaのマルチスレッドプログラミング、通信スレッドのいくつかの方法とを学びます。このセクションでは、練習する、いくつかのデモを作成する必要があります。


2、その後、私たちは、このようなConcurrentHashMapの、同時ツール、アトミックデータ型と他のツールとして、APIにJUCの一部を使用することができ、このセクションを学んで、あなたが本の数との並行プログラミングを紹介し、一緒にブログすることができ、私がいた図書「Javaの並行プログラミングの芸術」ことがわかり、私はより少し良い感じ「実際のJava並行処理。」

私は、このコラムでも、より良いブログのいくつか組み込まれて持っているので、私たちは見たいことがあります。


3は、次のステップは、ソースコードを読み取ることで、ソースコードは、最も重要なの部分は、ソースコードを自分で読むためにキュースレッドプールをブロックする、などのConcurrentHashMapとして、ソースJUCパッケージを読み取るために、そのため、当然のことながら、これらはもっと痛いだろうで読んで、それをブログと一緒に行くために提案されています。


4は、あなたがJavaの並行プログラミングの原理を理解する必要があり、ここまで来て、巧みインタビュー、本当に行くために、プロジェクトで使用されるこれらのものを入れるものの残りの部分に対処するために十分なJUCを、使用することができ、私は時間網易でインターンシップをしました私たちは、一部のコンテンツJUCを使用して、非常に興味深いものだったと言わざるを得ない。


 ここではJavaの並行プログラミングの主な内容のいくつかを教えて、と私は6つの部分にそれを置くために、我々はこれらの内容を参照することができ、研究の一部でした。

:基本的な同時マルチスレッド

まず、並行処理の基礎を習得する必要性、同時性とは何か、なぜ同時実行スレッドの概念、スレッドセーフの概念があります。

そして、スレッドの状態遷移、スレッド方式、通信および他のスレッドを理解し、スレッドまたは他の実装ではJavaスレッドを使用することを学びます。

2:JMMのメモリモデル

最終的には開発者が一連のルールを開発する必要性を一貫したプログラミングメモリモデルを与えるためにプロセッサ、JVMの仮想マシン上で実行されている任意の言語では、このルールは、異なるアーキテクチャの異なるマシン上で実行され、プログラマにアップすることができますユニファイドメモリモデルを提供するために、JMM。

だから、また、命令の並べ替え、メモリバリアを理解するJava並行処理理論、だけでなく、視認性の原理に焦点が特に重要であることが理解されるJMMメモリモデルを理解しています。

JMMのみ-前に起こるとされたままの場合、シリアル規則ことを保証するために、そのマルチスレッド時に、これらの3つの問題のアトミック性、可視性と順序を表示されることがあります。

以下の内容は、Javaがこれら三つの問題を解決する方法について説明します。

3:同期、揮発性、最終的およびその他のキーワード

同時実行の三の大問題については、揮発性の3つのプロパティを保証することができ、同期の可視性を保証することができます。

同期ベースのオペレーティングシステムミューテックスロック命令は、揮発性および最終的なJMMは、それらの意味記憶に応じて達成される、実施されます。

それはハードウェアで実装されているので、ここでも、同様の揮発性メモリのセマンティクスを提供し、原子の動作を保証するだけでなく、CAS操作を、理解しています。

JUCロックは底が揮発性CASプラスを達成するための方法を使用することです。同期CASはロック装置のヘビー級の動作を最適化しようとします。

これらのキーワードを理解することが必要です。

4:JUCパッケージ

将来的には上記の完全な理解は、我々はJUCの内容を見ることができます。

ロックJUCは、その上のスレッドプール、同期コンテナ、ツールとを備え、アトミック操作を提供します。

これらのクラスは、AQSに基づいているので、AQS原理を理解することが非常に重要です。

また、あなたはまた、/フォークを見て参加し、そして、そのような生産者と消費者、キューを遮断するだけでなく、読み取りと書き込み容器などの一般的なシナリオのJUCことができます。

5:実践

JMMのコンテンツ部分に加えて、これらの内容は、そのような基本的な使用をマルチスレッドとして、JUCは、より良い練習のコードでその原理を理解するために使用することができ、比較的貧しい達成します。実際に理解を深めて、シーンのカップルを試してみてください、またはオンラインより古典的な同時シーンのいくつかを見つける、または他の例、まだ非常に必要です。

6:補足

多くの初心者のJava並行処理プログラミングは良いマインドマップを置くためにはアイデアが、簡潔に重要なポイントよりも数字に言及していない可能性があるため、比較的基本的なポイントいくつかの並行プログラミングは、これらの基本の一般的な理解では、コンテンツの後、詳細を実行するために、後で良く学びます。

上記のコースを学んで述べたように、私は次のですので、あなたは、このコラムのいくつかのブログを見に行くし、この次の部分を見て、このルートをたどることを示唆しているが行われ、この列に基づいてすべてのブログをまとめ、主に促進することです、あなたが私の結論は十分ではないと思えば、あなたも自分の要約を行うことができ、これは学ぶための良い方法メモリやレビュー、だけでなく、あなたはそれが再び-住ん再知識に可能にされ、いくつかの単語の小さな男は、の上で読んでみましょう。

この要約は、主に形成された物品の私のJava技術並行シリーズをベースにしています。主なポイントは、再び、そこに多少の誤差があることが、また、私とポインティングを許して願っても自分の言葉で重要な知見です。ありがとう

Javaの並行処理技術ガイド:詳細は私のコラムを見ることができます

https://blog.csdn.net/column/details/21961.html

スレッドセーフ

  1. 线程安全一般指多线程之间的操作结果不会因为线程调度的顺序不同而发生改变。

相互排除と同期

  1. 互斥一般指资源的独占访问,同步则要求同步代码中的代码顺序执行,并且也是单线程独占的。

JMMメモリモデル

  1. JVM中的内存分区包括堆,栈,方法区等区域,这些内存都是抽象出来的,实际上,系统中只有一个主内存,但是为了方便Java多线程语义的实现,以及降低程序员编写并发程序的难度,Java提出了JMM内存模型,将内存分为主内存和工作内存,工作内存是线程独占的,实际上它是一系列寄存器,编译器优化后的结果。

-IF-シリアル、事前発生

  1. as if serial语义提供单线程代码的顺序执行保证,虽然他允许指令重排序,但是前提是指令重排序不会改变执行结果。

揮発性

  1. volatile语义实际上是在代码中插入一个内存屏障,内存屏障分为读写,写读,读读,写写四种,可以用来避免volatile变量的读写操作发生重排序,从而保证了volatile的语义,实际上,volatile修饰的变量强制要求线程写时将数据从缓存刷入主内存,读时强制要求线程从主内存中读取,因此保证了它的可见性。
  2. 而对于volatile修饰的64位类型数据,可以保证其原子性,不会因为指令重排序导致一个64位数据被分割成两个32位数据来读取。

同期と最適化されたロック

  1. synchronized是Java提供的同步标识,底层是操作系统的mutex lock调用,需要进行用户态到内核态的切换,开销比较大。

  2. synchronized经过编译后的汇编代码会有monitor in和monitor out的字样,用于标识进入监视器模块和退出监视器模块,

  3. 监视器模块watcher会监控同步代码块中的线程号,只允线程号正确的线程进入。

  4. Java在synchronized关键字中进行了多次优化。

  5. 比如轻量级锁优化,使用锁对象的对象头做文章,当一个线程需要获得该对象锁时,线程有一段空间叫做lock record,用于存储对象头的mask word,然后通过cas操作将对象头的mask word改成指向线程中的lockrecord。

  6. 如果成功了就是获取到了锁,否则就是发生了互斥。需要锁粗化,膨胀为互斥锁。

  7. 偏向锁,去掉了更多的同步措施,检查mask word是否是可偏向状态,然后检查mask word中的线程id是否是自己的id,如果是则执行同步代码,如果不是则cas修改其id,如果修改失败,则出现锁争用,偏向锁失效,膨胀为轻量级锁。

  8. 自旋锁,每个线程会被分配一段时间片,并且听候cpu调度,如果发生线程阻塞需要切换的开销,于是使用自旋锁不需要阻塞,而是忙等循环,一获取时间片就开始忙等,这样的锁就是自旋锁,一般用于并发量比较小,又担心切换开销的场景。

CAS操作

  1. CAS操作是通过硬件实现的原子操作,通过一条指令完成比较和赋值的操作,防止发生因指令重排导致的非原子操作,在Java中通过unsafe包可以直接使用,在Java原子类中使用cas操作来完成一系列原子数据类型的构建,保证自加自减等依赖原值的操作不会出现并发问题。

  2. cas操作也广泛用在其他并发类中,通过循环cas操作可以完成线程安全的并发赋值,也可以通过一次cas操作来避免使用互斥锁。

ロッククラス

AQS

  1. AQS是Lock类的基石,他是一个抽象类,通过操作一个变量state来判断线程锁争用的情况,通过一系列方法实现对该变量的修改。一般可以分为独占锁和互斥锁。

  2. AQS维护着一个CLH阻塞队列,这个队列主要用来存放阻塞等待锁的线程节点。可以看做一个链表。

A:排他ロック

排他ロック状態のみ0と両方の場合に1(それはリエントラントロックである場合にも状態に加えることができるが、ここでは議論しない、アップされている)、状態= 1つの解説スレッドの競合は、ロックに使用されています。通常、ロック方式のAQSスルー状態がゼロの場合、最初のスレッドロックCASが状態= 1を修正取得しようと、正常に失敗した場合にブロックされたキューを返します。非公共のロックを使用している場合、あなたはまだ正直キューで立ち往生失敗した場合、ロックはまだ最終的にはその後、ブロックされたキューにCASスレッドノードを取得しようとします。

排他ロックが公正かつ不当ロックラッチに分割することができる、ロックが解除されると、ロックは、フロントロック獲得ノードとしてノードの所定の状態を経てポストノードの状態を変更する遮断順序に基づいて公平キューラッチノードを、必要私たちは、リアのノードに通知します。

不当なロックは、必ずしも、上述したように、キューノードの順序に従ってロックし得ることはありません最初のCAS操作が再入力ブロッキングキューを失敗しようとします。

II:共有ロック

ロック状態は、nに共有状態0であってもよいです。キューと同じではありませんmutexをブロックする共有ロックのメンテナンスは、それが唯一のノードリリースミューテックスロック、およびすべての共有ノードの種類を通知しますロックを取得するには、共有ロックの後にリアノードを通知しますので、彼らはロックを取得する必要があります。等のたCountDownLatchツールとcyliderbarrier、の共有ロックは、よく複数のスレッドの作業を調整するために行うことができます

ロックロックとConditon

ロックはメンテナンスやunfairsync fairsync 2つの内部クラスをロックし、AQSから継承されている、それは実際には、ロックがちょうどAQSパッケージを再実行するのメソッドやAQSのほとんどは、それが簡単にプログラマがロックを使用できるようにするため、方法の一部を書き直しましたロック。

ロックと同様の条件を使用してロックし、唯一のロックロックはブロッキングキューを維持するので、時々私たちは、一般的に複数のロックオブジェクトを使用して、あなたが今の状態に使用することができ、ロックと行うにはどのようにロック通知によってブロックされ、さ​​まざまな状況を分割したいです条件がロックして使用を結合しているため、これが行われ、スレッドAとスレッドBがイベントAとBを待っているように、次の2つの条件を使用することができるようには、Bのキューに2つのキュー、A上のキューA、Bを維持するためにありますトリガイベント、スレッドが起こされるとき、この時間は、彼はあなたのCLHは、ロック競合を行ってロックキューに参加します、もちろん、それはまた、株式及び非株式キー2つのロックに分割し、上記のようにしています。

そのような生産者と消費者モデル、別の例示cyliderbarrierとして広く使用されているJUCパッケージの組み合わせをロックしcondtion。

読み書きロック

ロックは、上位16ビットと障害物の下位16ビットの読み書きロック状態を使用して、読み取りスレッドと書き込みスレッドノードのノードを格納しながら、共有ロックと排他ロック・キューを表す状態にあるサブクラスであるロック書き込み、場合共有ロック状態> 0は、リードロック、および状態-1 = 0の場合には、ブロックキューに加えを取得し続けるロックと排他ロックのような処理ノードを書き込むので、ノードの二つのタイプのキューが存在することになることができロックはロックウェイクノードを作成し、ウェイクアップノードノード読み取りロックを起こしていない書き込み、それ以降のノードが起動します。

したがって、一般的に少ないシーンで読み込みと書き込みのためのロックを書き、読むにダウングレードすることができ、ラッチロックは書き込みロックを取得する際には、その後読み取りロックを獲得できるということです書き込み。

同時ツール

1たCountDownLatch

たCountDownLatch AQS主として実行カウントダウンのスレッドが存在するときはいつでも共有モデル、Nに設定し、NサイズたCountDownLatchで初期化される初期状態を経て、状態1、状態= 0になるまでキューに保持すべてのスレッド、状態=ウェイクチームのヘッドノードは、チームのヘッドノードは、順番に、0:00にノードのすべての共有のタイプを知らせるこれらのスレッドを覚ますと、背後にあるコードを実行します。

2 cycliderbarrier

主にロックや条件によってcycliderbarrier実現するために組み合わせて、最初の障壁としての状態を待っているスレッドの数、ノードを設定障壁を設定し、実行中のすべてのスレッドが、実際には、ここに待っているキュー内で待機している状態をブロックします、そしていつでもスレッド状態、そこに到達する - = 1、すべてのスレッドが到着したとき、状態= 0は、すべてのノードは、状態キューをウェイク後ろにコードを実行します。

3 Samphan

samphereも、実装のAQS共有モードを使用して、類似したcountlatch、それらを繰り返しません。

4交換

より複雑な交換。交換機を使用する場合は2つのスレッドが相互に作用させるためにいくつかのスペースを開きます、このスペースは、通常、スタックやキュー、データが最初にこの庭箱に入って来たし、別の場合には、他のスレッドは、彼と一緒に交換するのを待っているブロックされたスレッドですスレッドはまた、両方の左、その後、データを読み取り、グリッドに他のスレッドを自分のデータを置く、入って来ました。もちろん、スタックとキューの対話的な使用はスタックを使用し、異なっている、そして試合は、最新のincomingキューでスレッドです反対です。

アトミックデータ型

アトミックデータ型は、基本的には、同時操作しながら、安全性の問題を回避するために、CASの操作によって達成されます。

同期コンテナ

同期コンテナは、主のConcurrentHashMap、およびコレクションで私はCHMを話したので、ここでは、同期セグメント化されたロックロック粗大化、死んだLLockロックの使用、および1.8を使用して達成することchm1.7シンプル通過ですそしてCAS、より良いパフォーマンスを組み合わせました。

concurrentlinkedlist、ConcurrentSkipListMapのとCopyOnWriteArrayListとがあります。

最初のリストは、CASによって達成して同期されます。

そしてConcurrentSkipListMapのテーブルは、ジャンプで、テーブルをジャンプ多くの層に分割され、各層がリンクされたリストで、各ノードは、ダウン細かいポインタを介して、右への第一のポインタによってインデックスさ2つの下方および右ポインタを有することができます検索では、検索効率が非常に高く、LOGNに達することができる、比較的低い達成することは困難です。ジャンプテーブルのエントリによってリンクされたリストにマップノードを保存することです。これは、クエリテーブルクエリの規則に従ってジャンプすることができます。

新しいリストを修正する書き込みロックではないクエリ、およびが動作するためにコピーされ、その後、元のリストに割り当てることができたときにCopyOnWriteArrayListとリストがコピーされます。読んで少しシーンを書いてください。

ブロッキングキュー

BlockingQueueのArrayBlockingQueueの実現

  1. ArrayBlockingQueue其实就是数组实现的阻塞队列,该阻塞队列通过一个lock和两个condition实现,一个condition负责从队头插入节点,一个condition负责队尾读取节点,通过这样的方式可以实现生产者消费者模型。

BlockingQueueのLinkedBlockingQueueの実現

 
 
  1. LinkedBlockingQueue是用链表实现的阻塞队列,和arrayblockqueue有所区别,它支持实现为无界队列,并且它使用两个lock和对应的condition搭配使用,这是因为链表可以同时对头部和尾部进行操作,而数组进行操作后可能还要执行移位和扩容等操作。

  2. 所以链表实现更灵活,读写分别用两把锁,效率更高。

BlockingQueueのSynchronousQueueの実現

  1. SynchronousQueue实现是一个不存储数据的队列,只会保留一个队列用于保存线程节点。详细请参加上面的exchanger实现类,它就是基于SynchronousQueue设计出来的工具类。

BlockingQueueのPriorityBlockingQueueの実現

PriorityBlockingQueue

  1. PriorityBlockingQueue是一个支持优先级的无界队列。默认情况下元素采取自然顺序排列,也可以通过比较器comparator来指定元素的排序规则。元素按照升序排列。

DelayQueue

  1. DelayQueue是一个支持延时获取元素的无界阻塞队列。队列使用PriorityQueue来实现。队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素。只有在延迟期满时才能从队列中提取元素。我们可以将DelayQueue运用在以下应用场景:

  2. 缓存系统的设计:可以用DelayQueue保存缓存元素的有效期,使用一个线程循环查询DelayQueue,一旦能从DelayQueue中获取元素时,表示缓存有效期到了。

  3. 定时任务调度。使用DelayQueue保存当天将会执行的任务和执行时间,一旦从DelayQueue中获取到任务就开始执行,从比如TimerQueue就是使用DelayQueue实现的。

スレッドプール

クラス図

まず見た目エグゼキュータ・インタフェース、唯一の実行方法を提供すること、そして彼のサブインタフェースExecutorServiceのの一つは、このような提出タスク、スレッドプールの終わりとしてより多くの方法を提供しています。

そして、抽象クラスabstractexecutorserviceは、より多くの実現を提供し、最終的に我々ThreadPoolExecutorは、最も一般的に使用されるクラスは、それが来た継承しています。

ThreadPoolExecutorは、スレッドプールを達成カスタマイズするために、様々なパラメータを渡すことができます。

そして、我々はまた、一般的なスレッドプールをインスタンス化するために、エグゼキュータのファクトリメソッドを使用することができます。

一般的なスレッドプール

例えばnewFixedThreadPool

newSingleThreadExecutor newCachedThreadPool

コールバック関数コール呼び出し可能な、前後に実行結果を、将来を経由して、結果を受け取る、または書き込みに戻ってきた呼び出し可能なの結果を提出するために提出されたスレッドプールとfuturetaskタスクを使用することなどnewScheduledThreadPool、、。また、タスクの値を実行runableノンリターンを実行するために使用することができます。

これらのスレッドプールの違いを説明する前に、スレッドプールのいくつかのコアコンセプトを見てみましょう。

1つのタスクキュー:タスクキューに参加するために、スレッドプールにジョブを送信するたびに、スレッドプールは、ジョブキューを維持します。

2つのワーカースレッド:またワーカーと呼ばれる場合があってもよいので、スレッドプールタスクから取得し、実行し、実行した後、回収又は保持。

3コアのスレッドの数及びスレッドの最大数は、スレッドプール内のスレッドのコアの数がタスクを受信するために生きているスレッドの数を保持する必要があり、スレッドの最大数が作成できるスレッドの数の上限です。

4 newFixedThreadPoolスレッドの固定コアの数とスレッドの最大数を設定することができ、タスクの後に、それが実行するスレッドを開き、開いたスレッドは、スレッドのコア数に達したときに糸のこの部分は、回収されず、最初の任務を入れてきましたタスクキューに。タスクキューが一杯になると、スレッドの合計数は、スレッドの制限の最大数をヒットした場合、処理するためにスレッドを開いていきます、タスクキューがいっぱいになって、それが対応する戦略を実行することを拒否します。

5戦略は、一般的に、尾のタスクを破棄し、呼び出し側にバックオフを実行する、または例外をスローし、このように廃棄タスクとして、一般的ないくつかを持って拒否し、カスタム拒否戦略を使用することができます。

6 newSingleThreadExecutorスレッドプールは、単一の実行スレッドが唯一のスレッドを維持するで、彼はまたタスクキューを持っている、キューがいっぱいになると、タスクがすでに時間のスレッド数のとき、その後、ジョブを送信し、ポリシーを否定実行されます。

7 newCachedThreadPoolではなく、特別な時に、スレッド、最初のタスクは、オープン来ると、スレッドが先にタスクを実行していない場合、新しいタスクはそこに来ている、その後、それは、キュー容量SynchronousQueueを使用せずに、スレッドプールをスレッドを作成します。要求スレッドを受け入れて、タスクの実行を一致させるためにスレッドするために必要な場合は、完了します。タスクが提出され、ケースに対処するには遅すぎスレッドを受け入れてきたのであれば、それは今までスレッドプールのスレッド、CPUや大義を作成するにつながります。

delayqueueキューを使用して内部8 ScheduledThreadPoolExecutorのは優先度つきキュー、すなわち、ヒープ内のプライオリティキューです。このdelayqueueを通じてタイムスレッドのスケジューリングの順序と実行のポイントを知っています。

フォーク/参加の枠組み

また、スレッドプールを盗む作品として知られています。

分割統治:私たちアルゴリズム大学の教科書は、基本的なアルゴリズムである学びました。基本的な考え方は次のとおりです。いくつかのサブタスクに大規模なタスクに、これらのサブタスクを計算し、最後に最終結果をマージしています。このプロセスは、通常、再帰を使用しています。

フォーク/参加は実際にマルチスレッドを使用するための並列フレームワーク「除算をし、アルゴリズムを征服」を達成するようなものです。

一方、FORIは/削減/地図のスタンドアロンバージョンとして参加することができますが、ここでの並列は、並列コンピューティングでは、複数のマシンではなく、並列コンピューティングにおける複数のスレッド。

上記の例による1とのThreadPoolの違いは、私たちが使用してそれを見ることができる、とのThreadPoolが相違点もありますが、共通している:(1)ThreadPoolの唯一の「外部ミッション」、つまり、呼び出し側は、タスクのキューを置きます。ForkJoinPool「外部の使命」、および「内部の仕事は」、それが実装プロセスでタスクそのもので、「サブタスク」を分割し、再帰、再びキューに入れました。(2)タスク通常クラス2内部ForkJoinPool、RecusiveAction / RecusiveTaskは、これらの二つはFutureTaskから継承されています。使用時には、その計算アルゴリズムを書き換えます。

2ワークスチールアルゴリズムは、上記の「外部の使命」ともありますForkJoinPool「内部タスクを実行します。」これでは、外部タスクは、内部ForkJoinPoolグローバルキューを置くことであり、各ワーカースレッドは、また、内部の作業を格納するための独自のキューを持っています。

基本的な考え方は、3を盗むためにある:労働者の彼のジョブキューは、タスクがない場合は、別のスレッドキューをスキャンするために行く、他の人が実行するタスクを引き継ぎます

マイクロチャンネル公衆数

個人公開番号:黄斜め

ソフトウェアエンジニアリングの黄斜め反対尋問985マスター、自己学習のJava 2年間は、技術的な白からアリエンジニアとして成長、ほぼ10のメーカーが提供するBATを得ました。

JAVAの著者は現在、プログラマ乾燥、体験学習、仕事の経験や生活プログラムを共有することに熱心、バックエンドテクノロジー・スタックに焦点を当て、小さな黄色の対角線CSDN 100万+ビューをブログ、ファンはほとんど2W +を知って、ネットワーク全体では10W +リーダーを持っています。

黄は、少し斜めのスラッシュの若者で、研究と執筆に準拠し、生涯学習の力を信じ、希望とより多くのプログラマが友人を作り、進歩と一緒に成長します!

オリジナルのeBook:
私のオリジナル電子書籍電子書籍「:白からアリババのJavaテクノロジー・エンジニアプログラマーズ新人練習マニュアル」を収集する[番号]黄斜め返信[元]の後に世間の注目

プログラマ3T技術学習リソース:リソースまくる技術を学ぶいくつかのプログラマは、世間の注目の数は、背景がキーワード返信「データ」は何のルーチンを無料で入手することはできません。

PubMedの情報確認:
コンピュータのPubMedまくるを、公共のコースとプロのビデオレビューを含むPubMedのレビューは、ここでみんなにそれをお勧めします私自身の使用のための検討材料の一部である、世間の注目の数は、背景がキーワード返信「のPubMed」で、無料でご利用いただけます。

公共技術いいえ:Java技術の川や湖

SSM、SpringBoot:あなたは私のリアルタイム更新記事とドライの共有に注力したい場合は、川や湖の私の公共の数に焦点を当てることができます] [Javaの技術のJava、テクニカルエンジニアアリステーション、著者黄斜めには、Javaの関連技術に焦点を当てMySQL、分散、ミドルウェア、クラスタ、Linuxでは、ネットワーク、マルチスレッド、時には完全なJavaスタックの開発に取り組ん学習経験を共有するポイントドッカー、ELKだけでなく、ドライ商品や技術を話します!

Javaのエンジニアは、学習リソースを必要と:一部のJavaエンジニアの一般的な学習リソースを、世間の注目の数は、背景がキーワードの返信の「Java」何のルーチンを無料で入手することがありません。

私の公共の番号

ブログ記事複数のプラットフォームからこの記事OpenWriteリリース!

おすすめ

転載: www.cnblogs.com/AliCoder/p/11700737.html
おすすめ