Java連載109-sychronized關鍵的用途及其注意點、…

2020-04-12 16:08:34來源:博客園 閱讀 ()

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用 Java連載109-sychronized關鍵的用途及其注意點、自定義注解

一、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.歡迎關注微信公眾號:傅里葉變換,個人公眾號,僅用于學習交流,后臺回復”禮包“,獲取大數據學習資料

 

 


原文鏈接:https://www.cnblogs.com/ruigege0000/p/12688684.html
如有疑問請與原作者聯系

標簽:通過forHTTPvaluegit.NET

版權申明:本站文章部分自網絡,如有侵權,請聯系:west999com@outlook.com
特別注意:本站所有轉載文章言論不代表本站觀點,本站所提供的攝影照片,插畫,設計作品,如需使用,請與原作者聯系,版權歸原作者所有

上一篇:Spring Boot 監聽 Redis Key 失效事件實現定時任務

下一篇:使用 Spring Cloud Alibaba Nacos 實現服務注冊與發現

韩国三级在线看免费