ホームページ Java &#&チュートリアル Java8 の新機能の解釈 --StampedLock

Java8 の新機能の解釈 --StampedLock

Jun 17, 2017 pm 02:15 PM
java8 特性 解釈

この記事では、同期ロックから Java8 の新しい StampedLock までの比較分析を行っています。Java8 の新機能、StampedLock に興味のある方はぜひ一緒にご覧ください。Java8 は小さな API の改善です。同期などの記事は、マルチスレッド同時プログラミング

プログラミング

では常に古いトピックであり、これは最悪の場合、アプリケーションのスループットやその他のパフォーマンス指標を低下させることになると思います。 、ハングしてクラッシュしますが、この場合でも、情報の正確性を確保する必要があるため、選択の余地はありません。したがって、この記事では、同期ロックから Java 8 の新しい StampedLock までの比較分析を行うことにしました。StampedLock は誰もが失望するものではないと信じています。

synchronizedjava5 より前では、同期は主に synchronized を使用して実現されていました。これは Java 言語のキーワードであり、メソッドまたはコード ブロックを変更するために使用すると、最大 1 つのスレッドがコードを同時に実行することが保証されます。

4 つの異なる同期ブロックがあります:

1. インスタンス メソッド

2. 静的メソッドの同期ブロック

4. 皆さんはこれを知っているはずです。馴染みのないものなので、詳細は説明しません

synchronized(this)
// do operation
}
ログイン後にコピー

概要: Synchronized は、マルチスレッド同時プログラミングにおいて常にベテランの役割を果たしています。 , ただし、Java SE1.6ではSynchronizedにさまざまな最適化が行われた後、パフォーマンスも向上しました。


Lock


これは、Java 5 によって java.util.concurrent.locks に追加された新しい API です。 Lock はインターフェイスです。コア メソッドは、lock()、unlock()、および tryLock() です。実装クラスには、ReentrantLock、ReentrantReadWriteLock.ReadLock、ReentrantReadWriteLock.WriteLock が含まれます。同じメモリセマンティクス。

同期とは異なり、Lock は完全に Java で書かれており、Java レベルでの JVM 実装とは何の関係もありません。 Lock は、より柔軟なロック メカニズムを提供します。また、ロック投票、時限ロック待機、割り込みロック待機など、同期では提供されない多くの機能が提供されますが、ロックはコードを通じて実装されるため、ロックが確実に解放されるように、unLock()最後に{}以下は Lock のコード例です


rwlock.writeLock().lock();
try {
// do operation
} finally {
rwlock.writeLock().unlock();
}
ログイン後にコピー

概要: 同期よりも柔軟でスケーラブルなロック メカニズムですが、とにかく、同期コードの方が記述が簡単です

StampedLock


これは、java8 の java.util.concurrent.locks の新しい API です。

ReentrantReadWriteLock は、読み取り/書き込みロックがない場合にのみ書き込みロックを取得できます。これは、悲観的な読み取り (Pessimistic Reading) を実装するために使用できます。つまり、実行が読み取りの場合、書き込み先の別の実行が存在する可能性があります。同期を維持するには、ReentrantReadWriteLock の読み取りロックが便利です。 ただし、読み取りが多く書き込みが少ない場合、ReentrantReadWriteLock を使用すると、書き込みスレッドが飢餓の問題に遭遇する可能性があります。つまり、書き込みスレッドがロックを獲得するために競合できず、常に待機状態になります。

StampedLock 制御ロックには 3 つのモード (書き込み、読み取り、オプティミスティック読み取り) があります。StampedLock の状態は、バージョンとモードの 2 つの部分で構成され、対応するアクセスを表すチケット スタンプとして数値を返します。ロック状態。数値 0 は、書き込みロックがアクセスを許可されていないことを示します。読み取りロックは、悲観的ロックと楽観的ロックに分類されます。


いわゆる楽観的読み取りモード、つまり、読み取り操作が多く書き込み操作が少ない場合は、書き込みと読み取りが同時に発生する確率は非常に低いと楽観的に考えることができるため、悲観せずに complete を使用してください。読み取りロックを使用すると、プログラムはデータの読み取り後に書き込みによってデータが変更されたかどうかを確認し、その後の措置を講じることができます (変更情報を再読み取りするか、

例外をスローする
)。この小さな改善が大きな違いを生む可能性があります。プログラムのスループットを向上させます。 !

以下は Java doc によって提供される StampedLock の例です


class Point {
 private double x, y;
 private final StampedLock sl = new StampedLock();
 void move(double deltaX, double deltaY) { // an exclusively locked method
  long stamp = sl.writeLock();
  try {
  x += deltaX;
  y += deltaY;
  } finally {
  sl.unlockWrite(stamp);
  }
 }
 //下面看看乐观读锁案例
 double distanceFromOrigin() { // A read-only method
  long stamp = sl.tryOptimisticRead(); //获得一个乐观读锁
  double currentX = x, currentY = y; //将两个字段读入本地局部变量
  if (!sl.validate(stamp)) { //检查发出乐观读锁后同时是否有其他写锁发生?
  stamp = sl.readLock(); //如果没有,我们再次获得一个读悲观锁
  try {
   currentX = x; // 将两个字段读入本地局部变量
   currentY = y; // 将两个字段读入本地局部变量
  } finally {
   sl.unlockRead(stamp);
  }
  }
  return Math.sqrt(currentX * currentX + currentY * currentY);
 }
//下面是悲观读锁案例
 void moveIfAtOrigin(double newX, double newY) { // upgrade
  // Could instead start with optimistic, not read mode
  long stamp = sl.readLock();
  try {
  while (x == 0.0 && y == 0.0) { //循环,检查当前状态是否符合
   long ws = sl.tryConvertToWriteLock(stamp); //将读锁转为写锁
   if (ws != 0L) { //这是确认转为写锁是否成功
   stamp = ws; //如果成功 替换票据
   x = newX; //进行状态改变
   y = newY; //进行状态改变
   break;
   }
   else { //如果不能成功转换为写锁
   sl.unlockRead(stamp); //我们显式释放读锁
   stamp = sl.writeLock(); //显式直接进行写锁 然后再通过循环再试
   }
  }
  } finally {
  sl.unlock(stamp); //释放读锁或写锁
  }
 }
 }
ログイン後にコピー

概要:

StampedLock は ReentrantReadWriteLock よりも安価であり、消費量が少ないことを意味します。

StampedLockとReadWriteLockの性能比較

下の図は、ReadWritLockと比較して、1スレッドの場合、読み取り速度が約4倍、書き込み速度が1倍であることを示しています。

下の図は、6つのスレッドで読み取りパフォーマンスが数十倍、書き込みパフォーマンスも10倍近くであることを示しています:

下の図はスループットの向上を示しています:

概要

1. 同期は、一部の監視ツールを通じて監視できるだけでなく、コードの実行中に例外が発生したときに、JVM によって自動的に解放されます。 lock;

2 、 ReentrantLock 、 ReentrantReadWriteLock 、および StampedLock はすべて object レベルのロックです。

3 には unLock() を入れる必要があります。特に読み取りスレッドが増加するシナリオでは、StampedLock には複雑な API があり、競合相手が少ない場合には、同期が行われます。 a 優れた汎用ロック実装

6. スレッドの増加が予測できる場合、ReentrantLock は優れた汎用ロック実装です。

以上がJava8 の新機能の解釈 --StampedLockの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Win11システムでファイルのサフィックスを表示するにはどうすればよいですか?詳細な解釈 Win11システムでファイルのサフィックスを表示するにはどうすればよいですか?詳細な解釈 Mar 09, 2024 am 08:24 AM

Win11システムでファイルのサフィックスを表示するにはどうすればよいですか?詳細説明: Windows 11 オペレーティング システムでは、ファイル拡張子はファイル名の後のドットとその後の文字を指し、ファイルの種類を示すために使用されます。デフォルトでは、Windows 11 システムはファイルのサフィックスを非表示にするため、ファイル エクスプローラーではファイル名のみが表示され、ファイルの種類を直感的に理解することはできません。ただし、一部のユーザーにとっては、ファイルの種類をより適切に識別し、関連する操作を実行するのに役立つため、ファイル接尾辞の表示が必要です。

win7 home バージョンと win7 Ultimate バージョンの違いの紹介 win7 home バージョンと win7 Ultimate バージョンの違いの紹介 Jul 12, 2023 pm 08:41 PM

win7システムには、win7Ultimateバージョン、Win7Professionalバージョン、Win7Homeバージョンなど、多くのバージョンがあることは誰もが知っています。多くのユーザーは、HomeバージョンとUltimateバージョンの間で迷っており、どのバージョンを選択すればよいかわかりません。そこで今日は、Win7 Family Meal と Win7 Ultimate の違いについて説明します。 1. Experience Different Home Basic Edition を使用すると、日常の操作がより迅速かつ簡単になり、最も頻繁に使用されるプログラムやドキュメントにより迅速かつ便利にアクセスできるようになります。 Home Premium は最高のエンターテインメント体験を提供し、お気に入りのテレビ番組、写真、ビデオ、音楽を簡単に楽しんだり共有したりできます。 Ultimate Edition は、各エディションのすべての機能を統合し、Windows 7 Home Premium のすべてのエンターテイメント機能とプロフェッショナル機能を備えています。

あなたのコンピュータ上の Cookie データはどのフォルダにありますか?詳細な解釈 あなたのコンピュータ上の Cookie データはどのフォルダにありますか?詳細な解釈 Jan 19, 2024 am 10:19 AM

インターネットの継続的な発展に伴い、人々はますますブラウザーと切り離せないものになってきています。ブラウザでは、誰もが多かれ少なかれ Cookie を使用します。しかし、Cookieデータがどのフォルダーにあるのか知らない人も多いので、今回は詳しく説明しましょう。まず、Cookie とは何かを理解する必要があります。簡単に言えば、Cookie はブラウザによって保存されるテキスト情報であり、ユーザーの個人設定の一部をブラウザに保存したり、ユーザーの操作履歴を記録したりするために使用されます。ユーザーが同じ Web サイトを再度開くと、c

Spring MVC の主要な概念をマスターする: これらの重要な機能を理解する Spring MVC の主要な概念をマスターする: これらの重要な機能を理解する Dec 29, 2023 am 09:14 AM

SpringMVC の主要な機能を理解する: これらの重要な概念を習得するには、特定のコード例が必要です。 SpringMVC は、開発者が Model-View-Controller (MVC) アーキテクチャ パターンを通じて柔軟でスケーラブルな構造を構築するのに役立つ Java ベースの Web アプリケーション開発フレームワークです。ウェブアプリケーション。 SpringMVC の主要な機能を理解して習得すると、Web アプリケーションをより効率的に開発および管理できるようになります。この記事では、SpringMVC の重要な概念をいくつか紹介します。

Golang にはクラスのようなオブジェクト指向機能はありますか? Golang にはクラスのようなオブジェクト指向機能はありますか? Mar 19, 2024 pm 02:51 PM

Golang (Go 言語) には伝統的な意味でのクラスの概念はありませんが、構造体と呼ばれるデータ型が提供され、これによってクラスと同様のオブジェクト指向機能を実現できます。この記事では、構造体を使用してオブジェクト指向機能を実装する方法を説明し、具体的なコード例を示します。構造体の定義と使用法 まず、構造体の定義と使用法を見てみましょう。 Golang では、type キーワードを通じて構造を定義し、必要に応じて使用できます。構造には属性を含めることができます

ニーズと機能に基づいて、該当する Go バージョンを選択してください ニーズと機能に基づいて、該当する Go バージョンを選択してください Jan 20, 2024 am 09:28 AM

インターネットの急速な発展に伴い、プログラミング言語は常に進化し、更新されています。中でもGo言語はオープンソースのプログラミング言語として近年注目を集めています。 Go 言語は、シンプル、効率的、安全で、開発とデプロイが簡単になるように設計されています。高い同時実行性、高速なコンパイル、メモリの安全性などの特徴を備えており、Web開発、クラウドコンピューティング、ビッグデータなどの分野で広く使用されています。ただし、現在、Go 言語のさまざまなバージョンが利用可能です。適切な Go 言語バージョンを選択するときは、要件と機能の両方を考慮する必要があります。頭

Linux Bashrc とは何ですか?詳細な解釈 Linux Bashrc とは何ですか?詳細な解釈 Mar 20, 2024 pm 09:18 PM

LinuxBashrc は、Linux システムの構成ファイルであり、ユーザーの Bash (BourneAgainShell) 環境を設定するために使用されます。 Bashrc ファイルには、ユーザーのログインに必要な環境変数や起動スクリプトなどの情報が格納されており、ユーザーのシェル環境をカスタマイズできます。 Linux システムでは、各ユーザーは対応する Bashrc ファイルを持っており、このファイルはユーザーのホーム ディレクトリの隠しフォルダーにあります。 Bashrc ファイルの主な機能は次のとおりです。 環境のセットアップ

クリプト GPT とは何ですか? 3EX の Crypto GPT が通貨サークルへの新たな入り口となるのはなぜですか? クリプト GPT とは何ですか? 3EX の Crypto GPT が通貨サークルへの新たな入り口となるのはなぜですか? Jul 16, 2024 pm 04:51 PM

CryptoGPTとは何ですか? 3EX の CryptoGPT が通貨サークルへの新たな入り口と言われるのはなぜですか? 7月5日のニュースによると、3EXAI取引プラットフォームは、世界の仮想通貨投資家に包括的でインテリジェントな情報クエリとAI投資アドバイスを提供することを目的とした、AIテクノロジーとビッグデータに基づく革新的なプロジェクトであるCryptoGPTを正式に開始した。 CryptoGPT には、CoinMarketCap の上位 200 コインと数百の高品質なプロジェクト パーティー情報が含まれており、今後も拡大していく予定です。 CryptoGPTを通じて、ユーザーは詳細な取引コンサルティングレポートやAI投資アドバイスを無料で入手でき、情報コンサルティングサービスからインテリジェントな戦略作成、取引の自動実行までのフルスタックのクローズドループを実現します。現在、このサービスは無料です。必要です

See all articles