一、synchronized關鍵字 1.我們修改一下上一次連載中的withdraw方法 //synchronized關鍵字添加到成員方法上去可以達到同步記憶體變數的目的 public synchronized void withdraw(double money) { double after = t ...
一、synchronized關鍵字
1.我們修改一下上一次連載中的withdraw方法
//synchronized關鍵字添加到成員方法上去可以達到同步記憶體變數的目的 public synchronized void withdraw(double money) { double after = this.balance - money; try { //這裡我們故意延遲了一下,可以看出餘額不對了 Thread.sleep(1000); }catch(InterruptedException e){ } this.setBalance(after); }
這兩種方法關鍵字控制的範圍更大,後面代碼越來越多可能會降低效率,不如精準同步的代碼塊效率高
線程安全的類舉例:StringBuffer\Vector\HashTable
下麵講解一個案例
package com.bjpowernode.java_learning; public class D109_1_SynchronizedMechanism { public static void main(String[] args) throws InterruptedException{ MyClass109 mc = new MyClass109(); Processer109 p = new Processer109(mc); Thread t1 = new Thread(p); Thread t2 = new Thread(p); t1.setName("t1"); t2.setName("t2"); t1.start(); //延遲(保證t1線程先啟動,並執行run) Thread.sleep(1000); t2.start(); } } class Processer109 implements 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(); } } } class MyClass109{ public synchronized void m1() { //休眠 try { Thread.sleep(1500); System.out.println("m1....."); } catch(Exception w) { } } //m2方法會等m1方法結束,因為t1和t2共用了一個mc,並且m1和m2方法上都這個關鍵字,共用了一個對象mc public synchronized void m2() { System.out.println("m2......"); } // //m2方法執行不需要等待m1結束,因為m2方法上沒有synchronized // public void m2() { // System.out.println("m2......"); // } }
二、系統註解的使用
package com.bjpowernode.java_learning; import java.util.LinkedList; public class D109_2_SuperClass { public static void main(String[] args) { SuperClass109 superObj = new SuperClass109(); superObj.MethodA();//訪問了過時的方法,IDE會加上刪除線 System.out.println(superObj.var);//訪問過時的域,也會加上刪除線 SubClass109 subObj = new SubClass109(); subObj.MethodB1(); //------------- //下麵的註解用於抑制其下麵的語句的編譯警告信息 @SuppressWarnings("rawtypes") LinkedList list = new LinkedList(); //下麵兩條語句沒有加@SuppressWarnings,編譯時會出現警告信息 list.add(123); list.add("Beijing"); for(int i=0;i<2;i++) { System.out.println(list.get(i)); } } } class SuperClass109{ //對var進行註釋,表示var已經過時,雖然var已經過時,但是仍然可以用 @Deprecated int var = 125; @Deprecated public void MethodA() { System.out.println("父類中的Method()方法!"); } public void MethodB() { System.out.println("父類中的MethodB方法!"); } } class SubClass109 extends SuperClass109{ //@Override public void MethodB1(){ System.out.println("子類重寫父類中的方法MethodB()!"); } }
三、自定義註解
1.自定義註解要使用@interface來聲明,會自動繼承java.lang.annotation.Annotation介面
2.在定義自定義註解的時候,不可以繼承其他的註解和介面,@interface只用來聲明一個註解,註解中的每一個方法實際上是聲名了一個配置參數。
3.方法的名稱就是參數的名稱,返回值類型就是參數的類型。返回值的類型只能是基本數據類型、Class、String、Enum。可以通過default關鍵字聲明參數的預設值。
4.語法格式
[public|final] @interface 註解名{ 註解元素 }
其中,關鍵字@Interface表示聲明一個自定義註解,“註解名”是合法的標識符,“註解元素”是無參數的方法,方法的類型白哦是註解元素的類型。
註解元素的語法格式
數據類型 註解元素名() [default 預設值]
如果只有一個註解元素,在註解元素名為value的情況下,在使用的時候就可以不寫出註解元素名,只需要直接給出註解值即可。在使用自定義註解的時候,要將自定義註解放在需要註解的前一行或者同一行,並且咋愛自定義註解後的括弧中寫出註解元素的值。如果使用預設值,則可以不給出紙介質,如果只有一個註解元素並且名為value,只需要給出值,而不需要給出註解元素名。
四、源碼:
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.歡迎關註微信公眾號:傅里葉變換,個人公眾號,僅用於學習交流,後臺回覆”禮包“,獲取大數據學習資料