对于下面的程序:
public class MyThread extends Thread{ private Object obj; ...... }
请问,这个MyThread里面的成员变量,是不是线程安全的?
因为,MyThread继承了Thread,其使用方式为:new MyThread().start();所以,这就意味着,每次都是new了新对象,那么,他里面的各个成员变量就是这个对象自己拥有的,所以,是安全的。我这样理解有问题吗?
光阴似箭催人老,日月如移越少年。
スレッドの安全性は、複数のスレッドで使用されるかどうかに関係します
定義したものはprivateですが、他のスレッドで間接的にアクセスする方法がたくさんあるので、マルチスレッドでの利用も可能ですが、コードに同期処理が追加されていないので安全ではありません。
private
Thread と Runnable の使用に違いはありません:
ケースなしの実行例 (見つけるまでに数回実行する必要があります)
新しいオブジェクトが作成されるたびに、そのオブジェクト内のマップはオブジェクト自体が所有するため、安全です。
この文は正しいです。ただし、サブスレッドを呼び出すメインスレッドでパブリック メンバー (変数) を宣言し、サブスレッド内でこのパブリック変数を操作するか、このパブリック変数を参照によってサブスレッドに渡します。マップ型自体がスレッドセーフであるかどうかについては、忘れてしまいました (マップがスレッドセーフであるかどうかに関係なく、マップがインターフェイスであることは覚えています)。特定の実装については、Baidu で検索できます。 。 。
マップ自体の実装がスレッドセーフであれば、マルチスレッド内でどのように操作しても問題ありません。 (メインスレッドで宣言して子スレッドに参照渡ししても)
スレッドの安全性に関する具体的な一般科学の知識については、私が以前に書いた記事を読むことができます https://zhuanlan.zhihu.com/p/...
それは次のようなものです: あなたはスーツケースにお金を入れて、一人で通りを歩きます。 もちろん安全だと思います。 しかし、一度盗まれてしまえば、安全ではありません。 。 。
スレッド セーフとは、異なるスレッドが同じデータにアクセスすることを意味します。スレッドが 1 つしかない場合、スレッド セーフはありません。または、これを「安全」であると理解することもできます。結局のところ、他のオブジェクトはアクセスできませんが、「スレッドセーフ」ではありません
質問に答えてください:
このマップ オブジェクトはスレッド安全ではありませんか?
はい、スレッドセーフではありません。 ここでの各 Thread オブジェクトには一意で独立した Map オブジェクトがありますが、「スレッド安全機能」がないからです。 まあ、これは私の理解ですが、少し冗長なようです。 。 。 ==
ご招待ありがとうございます! のでのの使用はnew MyThread().start()的情况下是线程安全に限定されます。
new MyThread().start()
线程安全
プライベートとして宣言しても、同期ロックがなければ別のスレッドで変数を読み取ることができ、スレッド安全ではありません。
読み取りには問題ありませんが、書き込みではスレッドの安全性の問題が発生します。 。 。
1. スレッドセーフなクラスメソッドを使用する
2. スレッドローカルを使用する
MyThread只是看成一个类(别想它是一个线程类),把obj をこのクラスのメンバーとして考えてください。そうすると、分かりやすくなります。
MyThread
obj
マルチスレッドの場合
これは主に、特定の公共リソースにアクセスしたかどうかに依存します。この質問には特定の公共リソースへのアクセスが含まれていないため、安全であるか危険であるとは言えません。
それは主に、この変数を操作したかどうかに依存し、毎回新しいオブジェクトが生成されると仮定すると、スレッドセーフです。
スレッドの安全性は、複数のスレッドで使用されるかどうかに関係します
定義したものは
private
ですが、他のスレッドで間接的にアクセスする方法がたくさんあるので、マルチスレッドでの利用も可能ですが、コードに同期処理が追加されていないので安全ではありません。補足
Thread と Runnable の使用に違いはありません:
リーリーケースなしの実行例 (見つけるまでに数回実行する必要があります)
リーリーこの文は正しいです。ただし、サブスレッドを呼び出すメインスレッドでパブリック メンバー (変数) を宣言し、サブスレッド内でこのパブリック変数を操作するか、このパブリック変数を参照によってサブスレッドに渡します。マップ型自体がスレッドセーフであるかどうかについては、忘れてしまいました (マップがスレッドセーフであるかどうかに関係なく、マップがインターフェイスであることは覚えています)。特定の実装については、Baidu で検索できます。 。 。
マップ自体の実装がスレッドセーフであれば、マルチスレッド内でどのように操作しても問題ありません。 (メインスレッドで宣言して子スレッドに参照渡ししても)
スレッドの安全性に関する具体的な一般科学の知識については、私が以前に書いた記事を読むことができます https://zhuanlan.zhihu.com/p/...
それは次のようなものです:
あなたはスーツケースにお金を入れて、一人で通りを歩きます。
もちろん安全だと思います。
しかし、一度盗まれてしまえば、安全ではありません。 。 。
スレッド セーフとは、異なるスレッドが同じデータにアクセスすることを意味します。スレッドが 1 つしかない場合、スレッド セーフはありません。または、これを「安全」であると理解することもできます。結局のところ、他のオブジェクトはアクセスできませんが、「スレッドセーフ」ではありません
質問に答えてください:
はい、スレッドセーフではありません。
ここでの各 Thread オブジェクトには一意で独立した Map オブジェクトがありますが、「スレッド安全機能」がないからです。
まあ、これは私の理解ですが、少し冗長なようです。 。 。 ==
ご招待ありがとうございます!
のでのの使用は
new MyThread().start()
的情况下是线程安全
に限定されます。プライベートとして宣言しても、同期ロックがなければ別のスレッドで変数を読み取ることができ、スレッド安全ではありません。
リーリー読み取りには問題ありませんが、書き込みではスレッドの安全性の問題が発生します。 。 。
1. スレッドセーフなクラスメソッドを使用する
2. スレッドローカルを使用する
MyThread
只是看成一个类(别想它是一个线程类),把obj
をこのクラスのメンバーとして考えてください。そうすると、分かりやすくなります。マルチスレッドの場合
リーリーこれは主に、特定の公共リソースにアクセスしたかどうかに依存します。この質問には特定の公共リソースへのアクセスが含まれていないため、安全であるか危険であるとは言えません。
それは主に、この変数を操作したかどうかに依存し、毎回新しいオブジェクトが生成されると仮定すると、スレッドセーフです。