1.同期キーワード
1.最後のシリアライゼーションでwithdrawメソッドを変更しましょう
// メモリ変数の同期化の目的を達成するための方法のメンバーにまですることができsynchronizedキーワードを追加し 、パブリック 同期 無効撤退(ダブルマネー){ ダブルをした後= この .balance - お金を、 試してみる{ // ここに我々は意図的に少し遅れて、あなたはバランスを見ることができます間違った のThread.sleep( 1000年); } キャッチ(InterruptedExceptionあるE){ } この.setBalance(後); }
これらの2つの方法では、キーワード制御範囲が大きくなり、将来的にはますます多くのコードが効率を低下させる可能性があります。これは、正確に同期されるコードブロックほど効率的ではありません。
スレッドセーフなクラスの例:StringBuffer \ Vector \ HashTable
事件を説明させてください
パッケージcom.bjpowernode.java_learning; パブリック クラスD109_1_SynchronizedMechanism { 公共 静的 ボイドメイン(文字列[]引数)をスローInterruptedExceptionある{ MyClass109 MC = 新しい)(MyClass109します。 Processer109 p = 新しいProcesser109(mc); スレッドt1 = new Thread(p); スレッドt2 = 新しいThread(p); t1.setName( "t1" ); t2.setName( "t2" ); t1.start(); // 延迟(保证t1线程先启动、および执行実行) Thread.sleep( 1000 ); t2.start(); } } クラス Processer109 実装Runnableを{ MyClass109 MC。 public Processer109(MyClass109 mc){ this .mc = mc; } public void run(){ if(Thread.currentThread()。getName()。equals( "t1" )){ mc.m1(); } if(Thread.currentThread()。getName()。equals( "t2" )){ mc.m2(); } } } クラスMyClass109 { public synchronized voidm1(){ // sleep try { Thread.sleep( 1500 ); System.out.println( "m1 ....." ); } catch (例外w){ } } // m2メソッドはm1メソッドが終了するのを待つ、t1とt2はmcを共有し、このキーワードはm1とm2の両方のメソッドで共有するため、オブジェクトを共有しますmc public synchronized void m2(){ System.out.println( "m2 ......" ); } // // m2メソッドは同期されていないため、m2メソッドの実行はm1の終了を待つ必要はありません // public void m2(){ // System.out.println( "m2 ......"); // } }
第二に、システム注釈の使用
パッケージはcom.bjpowernode.java_learning; インポートjava.util.LinkedList; パブリック クラスD109_2_SuperClass { 公共 静的 ボイドメイン(文字列[]引数){ SuperClass109 superObj = 新しい新しいSuperClass109(); superObj.MethodA(); //は時代遅れアクセスメソッドは、IDEが取り消し線を追加します System.out.println(superObj.var); // 古いドメインにアクセスし、取り消し線も追加し ますSubClass109 subObj = new SubClass109 (); subObj.MethodB1(); // - ------------ // 次の注釈は、 @ SuppressWarnings(以下のステートメントのコンパイル警告メッセージを抑制するために使用されます"rawtypes" ) LinkedList list = new LinkedList(); // 次の2つのステートメントでは@SuppressWarningsは追加されません 。コンパイル中に警告メッセージが表示されます 。add( 123 ); list.add( "Beijing" ); for(int i = 0; I <2; I ++ ){ System.out.printlnは(List.get(I)); } } } クラスSuperClass109 { // 注釈VARに、varは表しはvarが古いものの、古く、それでもよいですUse @Deprecated int var = 125 ; @Deprecated public void MethodA(){ System.out.println("Method()method in parent class!" ); } Public void MethodB(){ System.out.println( "MethodB method in parent class!" ); } } Class SubClass109 extends SuperClass109 { // @Override public void MethodB1(){ System.out.printlnは( "メソッドMethodBサブクラスは、(親クラスをオーバーライドします)!" ); } }
3.カスタムアノテーション
1.カスタムアノテーションは、java.lang.annotation.Annotationインターフェースを自動的に継承する@interfaceを使用して宣言する必要があります。
2.カスタムアノテーションを定義する場合、他のアノテーションやインターフェースを継承することはできません。@ Interfaceはアノテーションの宣言にのみ使用されます。アノテーションの各メソッドは実際には構成パラメータです。
3.メソッドの名前はパラメーターの名前であり、戻り値の型はパラメーターの型です。戻り値の型は、基本的なデータ型であるClass、String、Enumのみです。パラメータのデフォルト値は、defaultキーワードを使用して宣言できます。
4.文法フォーマット
[ public | final ] @ インターフェース アノテーション名{ アノテーション要素 }
その中で、キーワード@Interfaceはカスタムアノテーションを宣言することを意味し、「アノテーション名」は正当な識別子、「アノテーション要素」はパラメーターのないメソッド、メソッドのタイプはアノテーション要素のタイプです。
アノテーション要素の構文形式
データ型注釈要素名()[ デフォルト ]
アノテーション要素が1つのみの場合、アノテーション要素がvalueという名前の場合、アノテーション要素の使用時にアノテーション要素名を書き出す必要はなく、アノテーション値を直接付与するだけでよい。カスタムアノテーションを使用する場合は、前の行またはアノテーションを必要とする同じ行のカスタムアノテーションを解放し、カスタムアノテーションの後の括弧内にアノテーション要素の値を記述します。デフォルト値を使用する場合、紙媒体を指定することはできません。アノテーション要素が1つしかなく、値に名前が付けられている場合は、アノテーション要素名を指定する代わりに値を指定するだけで済みます。
第四に、ソースコード:
D109_1_SynchronizedMechanism.java
D109_2_SuperClass.java
https://github.com/ruigege66/Java/blob/master/D109_1_SynchronizedMechanism.java
https://github.com/ruigege66/Java/blob/master/D109_2_SuperClass.java
2.CSDN:https://blog.csdn.net/weixin_44630050
3.ブログパーク:https://www.cnblogs.com/ruigege0000/
4. WeChat公開番号に注意を払うことを歓迎します:フーリエ変換、個人公開番号、学習と通信にのみ使用され、バックグラウンドで「ギフトパック」と返信し、ビッグデータの学習資料を取得します