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

时间: 2024-08-30 16:16:34

Java连载109-sychronized关键的用途及其注意点、自定义注解的相关文章

Java连载62-使用throws关键字处理异常

?一.处理异常的两种方式 1.所有的编译时异常,要求程序员在编写程序阶段,必须对它进行处理,如果不处理的话,编译就会无法通过,处理异常有两种方法:捕捉和声明抛出. 2.捕捉:try.....catch....... 3.声明抛出就是方法声明的位置上使用throws关键字抛出异常. 4.所有RuntimeException的子类都是运行时异常,运行时异常程序员在编写阶段不需要对它进行处理. 5.编译时异常发生的几率比较高:运行时异常发生的几率比较低. 6.所有的Exception的直接子类都是“编

Java连载56-toSting方法和equals方法

Java连载56-toSting方法和equals方法一.关于object中的toString?方法: 1.SUN公司在Object类中设计toString方法的目的:返回java对象的字符串的表示形式. 2.在现实的开发过程中,Object里面的toString方法已经不够用了,因为Object的toString方法实现?的结果不满意.Object中的toString方法实现的结果不满意.Object中的呢toString?方法要被重写了. 3.println打印的如果是对象的话,那么就会默认

使用Java反射(Reflect)、自定义注解(Customer Annotation)生成简单SQL语句

这次给大家介绍一下在Java开发过程中 使用自定义注解开发:主要知识点:            1.反射            主要用于提取注解信息            2.自定义异常  主要是为了自己自定义一个异常信息            3.自定义注解  本次重点 学会如何自定义注解以及如何使用反射提取注解信息运用到实际开发下图表示在Java中注解的含义以及注解的分类和如何解析注解 通常我们使用自定义注解一般使用4中元注解即:@Target@Retention@Documented@In

java自定义注解学习(二)_注解详解

上篇文章,我们简单的实现了一个自定义注解,相信大家对自定义注解有了个简单的认识,这篇,这样介绍下注解中的元注解和内值注解 整体图示 内置注解 @Override 重写覆盖 这个注解大家应该经常用到,主要在子类重写父类的方法,比如toString()方法 package com.kevin.demo; public class Demo1 { @Override public String toString(){ return "demo1"; } } @Deprecated 过时 @D

Java自定义注解

自定义注解类编写的一些规则: 1. Annotation型定义为@interface, 所有的Annotation会自动继承Java.lang.Annotation这一接口,并且不能再去继承别的类或是接口. 2. 参数成员只能用public或默认(default)这两个访问权修饰 3. 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String.Enum.Class.annotations等数据类型,以及这一些类

【java开发系列】—— 自定义注解(转)

之前在开发中,就总纳闷,为什么继承接口时,会出现@Override注解,有时候还会提示写注解@SuppressWarnings? 原来这是java特有的特性,注解! 那么什么是注解呢? 注解就是某种注解类型的一个实例,我们可以用它在某个类上进行标注,这样编译器在编译我们的文件时,会根据我们自己设定的方法来编译类. 注解都是什么呢?看下面这张图就明白了! 上面的图可以看出,注解大体上分为三种:标记注解,一般注解,元注解 这里面Override这个没测试出来,因为目前的Eclipse会自动帮我们排错

转!java自定义注解

转自:http://blog.csdn.net/yixiaogang109/article/details/7328466  Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang.annotation 包中. 1.元注解 元注解是指注解的注解.包括  @Retention @Target @Document @Inherited四种. 1.1.@Retention

深入理解Java:注解(Annotation)自定义注解入门

引用: http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: [email protected

Java自定义注解的使用

最近学习了一下Java的自定义注解,终于知道了框架那些注解是咋个写出来的了,以后我也可以自己写框架,自己定义注解,听着是不是很牛的样子?不要心动,赶快行动,代码很简单,一起来学习一下吧! 这个例子是模仿框架的一个对sql拼装的例子,用注解实现对model也就是实体类的注释,就可以写出查询该字段的sql.好了,废话少说,一看代码便知.大家可以根据自己的需求修改. package com.annotation.demo; import java.lang.annotation.Documented;