1、synchronized關鍵字java
1.咱們修改一下上一次連載中的withdraw方法node
//synchronized關鍵字添加到成員方法上去能夠達到同步內存變量的目的 public synchronized void withdraw(double money) { double after = this.balance - money; try { //這裏咱們故意延遲了一下,能夠看出餘額不對了 Thread.sleep(1000); }catch(InterruptedException e){ } this.setBalance(after); }
這兩種方法關鍵字控制的範圍更大,後面代碼愈來愈多可能會下降效率,不如精準同步的代碼塊效率高git
線程安全的類舉例:StringBuffer\Vector\HashTablegithub
下面講解一個案例安全
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......"); // } }
2、系統註解的使用微信
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()!"); } }
3、自定義註解ide
1.自定義註解要使用@interface來聲明,會自動繼承java.lang.annotation.Annotation接口學習
2.在定義自定義註解的時候,不能夠繼承其餘的註解和接口,@interface只用來聲明一個註解,註解中的每個方法其實是聲名了一個配置參數。大數據
3.方法的名稱就是參數的名稱,返回值類型就是參數的類型。返回值的類型只能是基本數據類型、Class、String、Enum。能夠經過default關鍵字聲明參數的默認值。ui
4.語法格式
[public|final] @interface 註解名{ 註解元素 }
其中,關鍵字@Interface表示聲明一個自定義註解,「註解名」是合法的標識符,「註解元素」是無參數的方法,方法的類型白哦是註解元素的類型。
註解元素的語法格式
數據類型 註解元素名() [default 默認值]
若是隻有一個註解元素,在註解元素名爲value的狀況下,在使用的時候就能夠不寫出註解元素名,只須要直接給出註解值便可。在使用自定義註解的時候,要將自定義註解放在須要註解的前一行或者同一行,而且咋愛自定義註解後的括號中寫出註解元素的值。若是使用默認值,則能夠不給出紙介質,若是隻有一個註解元素而且名爲value,只須要給出值,而不須要給出註解元素名。
4、源碼:
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.歡迎關注微信公衆號:傅里葉變換,我的公衆號,僅用於學習交流,後臺回覆」禮包「,獲取大數據學習資料