Java連載109-sychronized關鍵的用途及其注意點、自定義註解

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.歡迎關注微信公衆號:傅里葉變換,我的公衆號,僅用於學習交流,後臺回覆」禮包「,獲取大數據學習資料

 

相關文章
相關標籤/搜索