比如StringBuilder在多线程中使用会导致线程不安全,这个不安全会产生什么后果,是数据不正确或丢失.?
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
最初にコードを提供しますので、自分で実行して試してみてください。
上記のコードでは、スレッドセーフでない ArrayList がメイン スレッドに追加され、この ArrayList に要素を追加するために 1000 個のスレッドが開かれ、すべてのスレッドが完了した後、この What が 100 個の要素を追加します。 ArrayList のサイズにする必要がありますか? 10万あればいいのでは?
ただし、実際の実行結果は 100000 にならない場合があります。結果は 99946、99955 になる可能性があります... これが、マルチスレッド操作の場合に非スレッドセーフなコレクションが誤った結果をもたらす理由です。
特定のスレッドの安全性については、私が書いたブログを参照してください: http://xxgblog.com/2013/05/16/java-threa...
これによりデータの不整合が生じ、取得されるデータが不正確になる可能性があります。その影響は完全にビジネス ロジックの制御下にあります。
たとえば、スレッド A はリストを走査しています
走査プロセス中に、スレッド B が来てリストから要素を削除します。その後、スレッド A は走査の終了時に IndexOutOfBoundsException を表示します。これは、実際の要素数が最大 - 1 になったためです。
最初にコードを提供しますので、自分で実行して試してみてください。
リーリー上記のコードでは、スレッドセーフでない ArrayList がメイン スレッドに追加され、この ArrayList に要素を追加するために 1000 個のスレッドが開かれ、すべてのスレッドが完了した後、この What が 100 個の要素を追加します。 ArrayList のサイズにする必要がありますか? 10万あればいいのでは?
ただし、実際の実行結果は 100000 にならない場合があります。結果は 99946、99955 になる可能性があります... これが、マルチスレッド操作の場合に非スレッドセーフなコレクションが誤った結果をもたらす理由です。
特定のスレッドの安全性については、私が書いたブログを参照してください: http://xxgblog.com/2013/05/16/java-threa...
これによりデータの不整合が生じ、取得されるデータが不正確になる可能性があります。その影響は完全にビジネス ロジックの制御下にあります。
たとえば、スレッド A はリストを走査しています
リーリー走査プロセス中に、スレッド B が来てリストから要素を削除します。その後、スレッド A は走査の終了時に IndexOutOfBoundsException を表示します。これは、実際の要素数が最大 - 1 になったためです。