を避ける同期(こ)Java?
-
22-07-2019 - |
質問
でも質問が出るというJavaの同期、非常に意欲のあると指摘してい synchronized(this)
することは避けてください。その代わりに、それらの請求には、ロック民間の参照が好ましい。
一部の指定された理由:
- 一部の 悪コード 場合を盗むでしょうロック (大人気のこもっvariant)
- すべての同期方法で同じクラス用のロックが軽減でき、スループット
- (必要以上に)触れる情報量が多すぎて
その他の人は、私も含めて、こ synchronized(this)
は熟に使用される景色は駅の屋根だけというものJavaライブラリ)が安全と考えられている。ので避けられないバグを組み合わせて管理の手がかりのように下記からダウンロードできます。言い換えればの場合は適用します。
私は見ても現実世界の事例(foobarもの)を避けるロック this
が好ましい場合 synchronized(this)
うものです。
そのため: は常に回避 synchronized(this)
に置き換えにロックに。
一部の更なる情報(随時更新して回答した:
- さまざまなインスタンスの同期
- も黙示的に(
synchronized
方法の明示的形式synchronized(this)
れ - 場合引用ブロッホやその他の当局には、放置しないでください出のパーツなど有効なJava、項目のスレッドの安全性: 通常、このロックのインスタンスそのものが例外をスローしました。)
- が必要な場合は粒度にロック以
synchronized(this)
を提供しsynchronized(this)
の適用はありませんでばいいのかわからない問題
解決
私がカバー各点ます。
悪のコードロック(大人気のこも "偶然"variant)
私はり気にな 偶然.その額にはこの使用
this
一部のクラスの露出インタフェース、および文書化されるべきである.ものその他のコードを使のロックが望まれる。このようなものCollections.synchronizedMap
のjavadoc).すべての同期方法で同じクラスの使用に同じ ロックが軽減でき、スループット
これは過度な単純化の考え方;ばく
synchronized(this)
な問題解決にはならない。適切な同期のためのスループットはかかりますが、思っている。(必要以上に)触れる情報量が多すぎて
この変異体#1.の利用
synchronized(this)
一部のインタフェース。ださい/の必要はあり露出しているんです。
他のヒント
でも、まずべきであることを指摘しておきたい:
public void blah() {
synchronized (this) {
// do stuff
}
}
は意味的に同等:
public synchronized void blah() {
// do stuff
}
ひとつの理由を使用しない synchronized(this)
.あると主張できるもの synchronized(this)
ブロックです。通常の理由はしない同期チェックで、あらゆる並行処理問題、具体的には、 ダブルチェック-ロックの問題, るだけでも困難であることができる比較的簡易なセキュリティチェックthreadsafe.
民間のロックを防御機構にはなっていません。
また、予告、個人のロックを制御できる粒度.一定の操作オブジェクトが完全に無関係な他のもの synchronized(this)
を相互に排除へのアクセスしています。
synchronized(this)
かないものです。
をご利用の同期化(こ)をご利用のクラスのインスタンスとしてロックそのものです。することながらロックが取得される 1スレッド, は、 スレッド2 べきます。
ここで、以下のコード:
public void method1() {
// do something ...
synchronized(this) {
a ++;
}
// ................
}
public void method2() {
// do something ...
synchronized(this) {
b ++;
}
// ................
}
方法1変更の可変 a 方法2変更の可変 b, の同時変更が同じ変数によるスレッドは避けるべきであります。ながら、 thread1 修正 a や thread2 修正 b って行うことができなくレースの条件です。
残念ながら、上記のコードすることはできませんこのしの参考のためのロック;このスレッドがない場合でも、レースの条件を待をかけて、コードを犠牲に並行処理のプログラム。
このセクションの利用 2 異なるロック用 二つの 異なる変数
public class Test {
private Object lockA = new Object();
private Object lockB = new Object();
public void method1() {
// do something ...
synchronized(lockA) {
a ++;
}
// ................
}
public void method2() {
// do something ...
synchronized(lockB) {
b ++;
}
// ................
}
}
上記の利用例○○○より詳細なロック(2錠ではなく一lockA や lockB のための変数 a や b それぞれを結果として可能なより良い並行処理、一方でよりも複雑になった最初の例---
ついつい付着した際に教条的なルールは"ロックボ"のシナリオが偏芯ですか?スレッドが実際にロックの取得おオブジェクト"外部"(synchronized(theObject) {...}
)、阻止その他のスレッドが待機中のインスタンスに同期します。
だということなの悪意あるコードは、このコードが第三者から(インスタンスを開発すれば何らかのアプリケーションサーバ).
の"偶発的"バージョンは少なくなってきていると思いるものとしてと言われた"ものをつくね-防人の発明より良いね".
ないのでは--のどのクラスは学校かった。
編集後eljenso初の3コメント:
体感したことのない、ロックを盗みの問題では架空のシナリオ:
せるシステムはservletコンテナのオブジェクトせていきたいと考えています。、 ServletContext
実装されます。その getAttribute
メソッドのスレッド、コンテキスト属性の共有データで宣言しまし synchronized
.ましょうもないかと想像を提供する公共ホスティングサービス型コンテナの実装です。
私のお客様と私の展開"良い"サーブレットに関するものとします。うちに自分のコードが含まれて呼び出 getAttribute
.
アップ、偽装としても、お客様の展彼の悪意のあるサーブレットに関するものとします。では、次のコードを init
方法:
synchronized (this.getServletConfig().getServletContext()) { while (true) {} }
として同じサーブレットのコンテキストによって許可されるスペックなどのサーブレットと同一のバーチャルホスト)、呼びかけ getAttribute
はロックされます。のハッカー達しDoSマservlet.
この攻撃できない場合 getAttribute
は同時にロックが第3者によるコードを取得できないこのロックが解除されます。
今の例では、逆に、oversimplisticビューのサーブレットコンテナの作品が、まぁいを証明するものです。
いう私のデザインの選択に基づく保安検討:まいを完全に制御できるコードにアクセスできるインスタンス?その結果のスレッドをロックインスタンスが無限に?
その異なる合意形成、C#、Javaキャンプします。 大多数のJavaコードを見への応用が期待されています。
// apply mutex to this instance
synchronized(this) {
// do work here
}
その大半はC#のコードoptsのューにより安全な:
// instance level lock object
private readonly object _syncObj = new object();
...
// apply mutex to private instance level field (a System.Object usually)
lock(_syncObj)
{
// do work here
}
C#ムは確かに安全性の向上を目指します。したがって、悪意のある/偶発的なアクセスのロックが可能で外からのインスタンス.Javaコードのこのリスクも どうも、Javaミgravitated時には安全ですが、ややエッセイは英語で書バージョン。
ことになるとしたものではありません掘り対Java、反射の私の経験に働います。
によって異なります。
をいただいた場合には共団体または以上です。
実例一覧はこちら こちらの
小さな導入。
スレッドと共有可能な主体の
ンで複数のスレッドにアクセス同事業体は、例えば複数のconnectionThreads共有シmessageQueue.以降のスレッド同時実行がされている可能性をオーバーのデータもありあます。
うにしていただく必要がありますが共有可能な主体にアクセスがひとつで、スレッドです。(並行処理).
同期ブロック
同期()ブロックを保証するための並行アクセスの共有可能な組織となる。
第一に、小さなえ
いつからP1,P2(スレッド)、洗面台(共有可能な社内に洗面所があり、ドアロック.
また一人用の洗面台です。
アプローチがドアをロックしよP1のドアがロックされP2まで待機しp1完成作品
P1のロックを解除扉
そのp1を使用でき洗面台.
構文です。
synchronized(this)
{
SHARED_ENTITY.....
}
この本質的なロックに関連するクラス(Java開発者の設計のオブジェクトクラスなどの各オブジェクトとしてモニター)上記のアプローチは適切に働きがある場合のみ共有者や複数のスレッド(1:いました。
N共有可能な団体-組織のスレッドM
今思うかもしれない状況がある場合は二つの洗面台内に洗面所の一つです。また、以前のアプローチは、p1することができ洗面台での時間がp2まで待ちます。では廃棄物の資源としては使用B2(洗面台).
は、知的なアプローチの創出にある小さな室内洗面所を提供して一戸当たりの洗面台.このように、P1にアクセスできB1およびP2でアクセスB2その逆も成り立ちます。
washbasin1;
washbasin2;
Object lock1=new Object();
Object lock2=new Object();
synchronized(lock1)
{
washbasin1;
}
synchronized(lock2)
{
washbasin2;
}
るの詳細を参照してくださいスレッド----> こちらの
の java.util.concurrent
パッケージが大幅に減の複雑さに私のスレッドに対して安全コードです。今回のミクロの証かもしれないけれど、最も作業していま見る synchronized(x)
が再実行ロボット、またはラッチが利用下-レベルモニター
この同期をこれらの機構に類似同期内部オブジェクトより漏えい、ロックが解除されます。このできることが有効ですがいの確実性は利用いただけますので参入によって二つ以上のスレッド)。
- データ不変であれば可能です(
final
変数) - できない場合は避ける突然変異の共有データを複数のスレッドを使用高いプログラミングを構築します[例粒状
Lock
API]
ロックを提供専用の共有リソースへのアクセス:唯一のスレッドで取得できるのは、ロスエロエスデイキケ記すべてのアクセスの共有リソースのロックを取得します。
サンプルコードの利用 ReentrantLock
を実装する Lock
インタ
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
lock.lock(); // block until condition holds
try {
// ... method body
} finally {
lock.unlock()
}
}
}
リロックの間に同期し(こ)
の同期方法または諸勢力のすべてのロックの取得及びリリースに発生するブロック構造です。
ロック実装を追加機能を提供する以上の同期方法及の提供
- 非ブロック取得を試みることができるように、ロック(
tryLock()
) - は、取得を試みることができるようにロックを掛けることが出来るので中断
lockInterruptibly()
) - は、取得を試みることができるように、ロック可能なタイムアウト
tryLock(long, TimeUnit)
).
- 非ブロック取得を試みることができるように、ロック(
ロッククラスでも動作やセマンティクスを提供するものと大きく異なりますの暗黙の監視ロックなど
- 保証された順序付け
- 非再応募者利用
- 行き詰まり検出
このSEに関する質問に対する様々なタイプの Locks
:
で表現できるスレッドの安全性により高度な並行処理APIの代わりにSynchroniedブロックとなります。このドキュメント ページ 提供プログラムの構築をスレッドの安全性です。
ロックオブジェクト ポロックとイディオムを簡単に多くの併願います。
執行者 を定義する高レベルAPIを立ち上げを管理す。Executor実装を提供するjava.util.同時提供のスレッドプール管理に適した大きなスケールアプリケーション.
兼職の状況所蔵 容易に管理可能な大規模なコレクションデータを大幅に削減することが可能に同期します。
原子力変数 しての特徴を最小化するような同期をやめたならもう放送すんな記憶の一貫性。
ThreadLocalRandom (JDK7)を分離することで効率的かつ世代の乱数から複数のスレッド)。
参照 java.util.兼職の状況 や java.util.兼職の状況.原子 パッケージにおいても、他のプログラミングを構築します.
また:
- ものだけはロック 現在のオブジェクト;や
- したい ロックでの粒度より 全体法
そのと思いますか、ブログ上synchronizezd(内にあります。
一部の人の意図的な使用に同期した(こ)の代わりに、マーキングの方法同期の)全体の内容の方法と考えているので、"より明確なリーダー"オブジェクトが実際に同期されます。ってのを作る人が知識を得た上で選択(例:このように彼らは実際に挿入追加のバイトコードの方法及びこれによって影響を潜在optimisations)思うのは特に問題です。しなければなりませんの文書を同時に行な行動のプログラムの中であると思いますか"を同期化して刊行動"の引数としても迫力満点。
している点は、"どのようなオブジェクトのロックを使用できると思うが間違っている同期現在のオブジェクト このようになりうると期待されるの論理はいかが?ているのか、どのクラスは一般的に使用する.例えば、コレクションのオブジェクトという論理的に見込みロックは一般的に、収集そのものです。
ていると思いますい説明についてなぜそれぞれの重要な技法の下でのベルトにしているというJavaの並行処理することにより、実際Brian Goetz.全て一点も明確なすものを使用しなければなロック"もの"を保護する状態のオブジェクトです。同期方法及びsynchronisingオブジェクトができます。E.g.ベクトルsynchronises全しますので十分ご注意ください。または個人のvectorオブジェクトとしても一緒に戦ってくれるかなという"入れない場合は"その単なるベクトルsynchronising独自の手法がなくなるわけではありませんから身を守るための腐敗することである。必要なものsynchroniseを同期(vectorHandle).このロックの取得を行っている各スレッドを扱うためのベクターを全体の状態ベクトルとなっています。これをクライアント側のロックしなければなりません。いているベクトルは同期(こ)/synchronisesそのすべての方法及びそのためsynchronisingのオブジェクトvectorHandle結果の適切なsynchronisationのvectorオブジェ。その愚を信じているスレッドに対して安全で使いのスレッドに対して安全です。これはまさにその理由ConcurrentHashMap明示的に導入したputIfAbsent法を行う事業を原子.
概要
- Synchronisingでの方法でクライアント側のロックしなければなりません。
- また、民間のロックオブジェクトでクライアント側のロックは不可能です。閲覧ありがとうございクラスな"入れない場合は"タイプの可能です。
- の場合の設計図書館-そのsynchronisingはsynchronisingの方法が多いだけ賢くなったと言える。できな位置決め方法のクラスが使用されます。
- たベクターを用い、民間のロックオブジェクトではないでしょうかな"入れない場合は"です。のクライアントコードのないゲインハンドルのロックが破れの基本的なルールを同じロックを保護するための状態です。
- Synchronisingこのまたは同期の方法を持ってい問題として指摘-人出することができるロックなリリースします。他のすべてのスレッドがもっと待ち続けるロックまでお問い合わせください。
- うかを確認することができま採用し、一つのことでしょうか。
- 人との主張が有する個人ロックオブジェクトでより良い粒度などの場合は業務と無関係ないが守られる異なるロックの結果よりーザーにとって大きな魅力です。この思いがデザインの匂いないコードの匂い場合、二つの業務が完全に無関係なぜ同じ。なぜクラスクラブ関係のない機能は全くないのでしょうか。するユーティリティクラス?Hmmmmあutil提供する文字列操作とカレンダーの日付フォーマットを通じて同じインスタンス??...いってきたいということで、そのた少なくとも!!
なん 常に.しかし、私はないので複数ある場合の懸念、特定のオブジェクトのみ必要threadsafeに関す。例えば、変更可能なデータオブジェクト"ラベル"および"子"の分野これらの必要threadsafeが、変更の必要はないブロックの書き込まれている/を読み込みます。(実際に私はこの宣言の分野での揮発性を利用java.util.兼職の状況のAtomicFoo包装).
同期一般的には少し不器用なもので叩大きなロックを減ら考えるのではなく、いつどのようスレッドをさせて頂く場合がござに動作します。を使用 synchronized(this)
もclumsier、反社会的、そのままのいなが変更 何 このクラスが、ロック".ることはあまりないかもしれないを実際に必要なのか。
いくらいは余裕かも細かいロック;でもいいから変化する"まかないserialisingのオブジェクト)したりすることも可能ですの全てを取得しのロックを同じことを、スペシャル"ホットスポットのより明確にすることができてうれしいです。ご利用の際は synchronized(this)
, なかが明確"なぜ同期、またはその副作用なのかもしれません。ご利用の場合 synchronized(labelMonitor)
, でも、より良い labelLock.getWriteLock().lock()
, で明らかにすることの効果の重要な部に限られます。
短答:予めご了承下さの違いと選択によってコードです。
長い回答:一般れているのではないかと思いをしないようにして 同期(こ) 削減の競合も個人ロックの追加の複雑さにつき意識している。く権利の同期の仕事です。ればな経験とマルチスレッドグされているのではないかと思いこだわりインスタンスをロック書を読み込んでいます。(とはいえ:だけを使用 同期(こ) なおクラスの完全スレッドセーフです。) これは難しい課題がありますので、答えを使用するかどうか 同期(こ) はないが自然に身についています。
ロックでも使用できるよう 視認性 または保護のためのデータから 同時変更 る。
きくプリミティブ型運営する原子が利用可能なオプションのように AtomicInteger
とりするスタイルもいいですね。
しかしいつの整数をそのような x
や y
座標は、相互の関係を考慮して変更することができ、原子です。そのよう保護して利用同じロックになっています。
Aロックを保護した状態であるのです。せりは禁止となっております。.ご利用の場合 synchronized(this)
各方法その場合においても状態のクラスは無関係ですべてのスレッドの顔争の場合でも更新に関係のない状態です。
class Point{
private int x;
private int y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
//mutating methods should be guarded by same lock
public synchronized void changeCoordinates(int x, int y){
this.x = x;
this.y = y;
}
}
上記の例ではいけ法による突然変異の両方 x
や y
なの異なる二つの方法として x
や y
関連といった異なる二つの方法のひとつのメカニズム x
や y
別途そのなかったのではないかと思うスレッドで安全です。
この例では明な方法で実施されるべきである。最良の方法だと 不変なので.
現在では反対の Point
例では、例もあり TwoCounters
既に提供@アンドレアスの状態で保護される二つの異なるロックの状態には関係あります。
の過程を異なるロックを保護関係のない状態と呼ばれ ロックゼブラゾーン等のラインまたはロックに分割
をしない理由同期に この となるときがありますがロック(第ロックとなることも珍しく削除された追加の考え方がまだ必要となり、中間状態しています。まロック この, は、もうひとつ忘れてはいけないのはロック この;場合はロック民間のオブジェクトでは、変数名が分かるのです。
リーダーからの視点で見れば、ロ この, をしました答えによらの質問:
- どのようなアクセスで保護されて この?
- はロックも本当に十分な人を紹介し、まるで友人の家に招か
例:
class BadObject {
private Something mStuff;
synchronized setStuff(Something stuff) {
mStuff = stuff;
}
synchronized getStuff(Something stuff) {
return mStuff;
}
private MyListener myListener = new MyListener() {
public void onMyEvent(...) {
setStuff(...);
}
}
synchronized void longOperation(MyListener l) {
...
l.onMyEvent(...);
...
}
}
場合は二つのスレッド開始 longOperation()
二つの異なるインスタンス BadObject
, て取得
そのロック;この呼び出し l.onMyEvent(...)
, して行き詰まりないことから、のスレッドが取得し、その他のオブジェクトのロックが解除されます。
この例でいる、あるいは行き詰まりによるロックは、短期業務及び長さです。
とってこの同期化ブロックでユーザー定義変数を使用してロックオブジェクトが同期機能のみを使用して"よ。もちろんを操ることができ地における機能を同期化する必要があります。
でもみんなそうな間同期機能ブロックをカバー全体の機能を"本"としてのロックオブジェクトです。ることではありません違いはバイトコードを生成する両です。場合に同期をブロックの使用に配分すべきローカル変数を持参。果たしていを少し大きめサイズの機能に関連のない場合は少ない数ですね。
より詳細な説明の違いだ。http://www.artima.com/insidejvm/ed2/threadsynchP.html
また利用の同期化ブロックすることができませんいにより以下の視点:
同期キーワードは非常に限られた一つの地域:終了する際には、同期ブロックでは、すべてのスレッドが待っているロックなブロック解除がで唯一のスレッドを取得し、ロック;すべてのその他のロックを取りに戻ると、以下のようになってい詰ます。ことになるだけでなく無駄な処理サイクル多くのコンテキストスイッチ除去に乗り出すスレッドにまたがるページングメモリのディスクのことから、高価です。
詳しくはこの地域でおすすめで学んだこ:http://java.dzone.com/articles/synchronized-considered
こん補にその他の回答が合わない場合には主たる異議についてオブジェクトをロックでcluttersクラス分野に関係しないビジネスロジックをプロジェクトのロンボク島においては、 @Synchronized
の定型でコンパイル時間:
@Synchronized
public int foo() {
return 0;
}
統る
private final Object $lock = new Object[0];
public int foo() {
synchronized($lock) {
return 0;
}
}
良い例での使用に同期(内にあります。
// add listener
public final synchronized void addListener(IListener l) {listeners.add(l);}
// remove listener
public final synchronized void removeListener(IListener l) {listeners.remove(l);}
// routine that raise events
public void run() {
// some code here...
Set ls;
synchronized(this) {
ls = listeners.clone();
}
for (IListener l : ls) { l.processEvent(event); }
// some code here...
}
ご覧のとおり、ここでの同期を使用していますが簡単に協力してlengthlyる無限ループの実行方法も同期方法である。
もちろん可能で非常に簡単に書き換えを用いた同期した個人ます。もつ場合について我々はすでにある程度デザインとの同期方法(レガシィクラスは、いくつかの基本的な性質を導いから、同期(こ)できる唯一のソリューション
によって異なり課題はいかないのです。また、チェックがスレッドに保存さいaccompish出来ていると思う。による同期(こ)のでしょうか。りもあ ロックのAPI ることができ:)
だけ欲しいんだけどはもちろんのことを解のための独自の民間参考原子部品のコードの依存関係.利用できる静的Hashmapとロックとシンプルな静的という名前のメソッドを原()を生成するに必要な参考文献を利用して自動的にスタック情報(全クラス名、行番号)とする。を利用することができるこの方法の同期計算書を書かずに新しいロックオブジェクトです。
// Synchronization objects (locks)
private static HashMap<String, Object> locks = new HashMap<String, Object>();
// Simple method
private static Object atomic() {
StackTraceElement [] stack = Thread.currentThread().getStackTrace(); // get execution point
StackTraceElement exepoint = stack[2];
// creates unique key from class name and line number using execution point
String key = String.format("%s#%d", exepoint.getClassName(), exepoint.getLineNumber());
Object lock = locks.get(key); // use old or create new lock
if (lock == null) {
lock = new Object();
locks.put(key, lock);
}
return lock; // return reference to lock
}
// Synchronized code
void dosomething1() {
// start commands
synchronized (atomic()) {
// atomic commands 1
...
}
// other command
}
// Synchronized code
void dosomething2() {
// start commands
synchronized (atomic()) {
// atomic commands 2
...
}
// other command
}
の使用は避け synchronized(this)
としてロック機構:このロックのクラスのインスタンスを引き起こすということが判明デッドロック.この場合、refactorのコードがロックのみを特定の方法で変数、またはそのクラスがないロックされています。 Synchronised
内で利用できる方法です。
の代わりに synchronized(this)
, 以下のコードだけなのにロックメソッドになっています。
public void foo() {
if(operation = null) {
synchronized(foo) {
if (operation == null) {
// enter your code that this method has to handle...
}
}
}
}
私の二つのセント2019年もこの問題が解決されています。
ロック上で、"この"できない場合は何をやっているか分から後ろのシーンロックで"この'が(残念ながら何で同期をキーワード方法を定義できる).
ごしたいユーザーのクラスできるような盗を"ロック(の防止その他のスレッドからの対応では、実際にたいすべての同期方法をお待ちながら他の同期メソッドが実行さい。この目的をよく考えたオフ(およびそのため文書化するためのサービスの提供を行います。
さらに凝ったり、逆に把握しておく必要があいている'と'(または喪失につなげるだけ)の場合はロック以外のロックアクセス(いすることが出来ます。盗を"ロック、合計の制御など...).
の問題だと思いることで同期をキーワードの方法を定義の署名でも簡単にプログラマー たとは思えない 何がロックされる強大な重要なことを考えておかない場合には走らせたいという問題は、マルチスレッドプログラム。
できない'は'によってお使いのユーザーのクラスができるようにこれらのものは、"はだいたい---で何が機能する。することができず、親指は原則としてできるのか予測すべての利用例です。
検討のための例のprintwriterを採用する内部ロックがその後の人も利用で複数スレッドからたくないとお考えの場合はその出力をinterleave.
あなたのロックアクセス以外のクラスは決定プログラマーとしての標準ではどのような機能をクラスです。はるかに少なくなっています。できませんの脱却のためのインスタンスから同期した(こ)への同期(provateObjetな危険にさらすの破れの変化のコードを使用しています。
注1:いきもの同期(こ)'に達'による明示的なロックオブジェクトや露出ないと思うので不要な場合の行動が記録されてとんどのロック上で、"この"します。
注2:んが趣旨は引数の場合は一部のコードが誤ってバンドは沢山のロック、そのバグとして解決します。この方法では同じ引数ていることのできるすべての私のやり方で公開した場合でもまうわけではありません公開する必要があります。れば誰かが誤って'呼び出し私の意図する個人法その場合もありますなぜするのはこのことを第一に!!!場合力を盗むでしょうロック問題のクラスになすことはありません。します。
と思うポイント(他人用ロック)(すべてのメソッドと同様の不必要なロック)が起こる可能性が任意の大きます。特にがいいと。
な鋳造石、そのほとんどが課題の練習を防止します。