1    主要内容

1.1  多线程debug

a  主要是在idea中,右键选择断点,选中thread,done即可。

b  使用的时候,frames选择下拉框,选择要执行的线程即可。

c  如下图所示

 

1.2  synchronized同步锁的调用

 如2.3所示

 如果锁放在静态方法上,锁的是整个class文件,如果放在非静态方法上,锁的是在堆内存中生成的对象。

详情参考 :https://blog.csdn.net/wagnteng/article/details/80529758

syncronized同步锁有加锁和开锁的开销,比较消耗资源,对性能有一定的影响。

1.3  懒加载的应用

外部类调取LazySingleton的时候才会进行初始化,所以实现了懒加载。

 

2    代码演练

2.1  单线程调用

测试类:

package com.geely.design.pattern.creational.singleton;

public class Test {

    public static void main(String [] args){
        //这样写异常,因为构造方法私有
//        LazySingleton lazySingleton = new LazySingleton();
       LazySingleton lazySingleton = LazySingleton.getInstance();
       System.out.println(lazySingleton);
    }
}

 

实体类:

package com.geely.design.pattern.creational.singleton;

public class LazySingleton {
    /*
    属性私有,其他外部类,无法调用该属性,安全
     */
    private static LazySingleton lazySingleton = null;

    /**
     * 构造方法私有,其他类无法实例化该类
     */
    private LazySingleton(){
    }

    /**
     * 这里写静态方法:因为外部类无法实例化创建出该类,
     * 只能通过该类的静态方法获取到该类。
     * @return
     */
    public static LazySingleton getInstance(){
        if(lazySingleton == null){
            lazySingleton = new LazySingleton();
        }
        return lazySingleton;
    }
}

 

打印结果:

"C:\Program Files\Java\jdk1.7.0_79\bin\java.exe" "-javaagent:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar=3988:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_79\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\rt.jar;F:\xiangmu3\Xin\Idea\design_pattern\target\classes" com.geely.design.pattern.creational.singleton.Test
com.geely.design.pattern.creational.singleton.LazySingleton@109d3f8b

Process finished with exit code 0

 

 

2.2  多线程调用

测试类:

package com.geely.design.pattern.creational.singleton;

public class Test {

    /*public static void main(String [] args){
        //这样写异常,因为构造方法私有
//        LazySingleton lazySingleton = new LazySingleton();
       LazySingleton lazySingleton = LazySingleton.getInstance();
       System.out.println(lazySingleton);
    }*/

    public static void main(String [] args){
        Thread thread1 = new Thread(new T());
        Thread thread2 = new Thread(new T());
        thread1.start();
        thread2.start();
        System.out.println("结束了!!!");
    }
}

 

线程类:

package com.geely.design.pattern.creational.singleton;

/**
 * 注:该类为线程类,调用LazySingleton
 */
public class T implements Runnable{

    @Override
    public void run() {
        LazySingleton lazySingleton = LazySingleton.getInstance();
        System.out.println(Thread.currentThread().getName()+"==="+lazySingleton);

    }
}

 

实体类:

package com.geely.design.pattern.creational.singleton;

public class LazySingleton {
    /*
    属性私有,其他外部类,无法调用该属性,安全
     */
    private static LazySingleton lazySingleton = null;

    /**
     * 构造方法私有,其他类无法实例化该类
     */
    private LazySingleton(){
    }

    /**
     * 这里写静态方法:因为外部类无法实例化创建出该类,
     * 只能通过该类的静态方法获取到该类。
     * @return
     */
    public static LazySingleton getInstance(){
        if(lazySingleton == null){
            lazySingleton = new LazySingleton();
        }
        return lazySingleton;
    }


}

 

打印日志1:

"C:\Program Files\Java\jdk1.7.0_79\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:4375,suspend=y,server=n -javaagent:C:\Users\weijingli\.IdeaIC2018.1\system\captureAgent\debugger-agent.jar=file:/C:/Users/weijingli/AppData/Local/Temp/capture.props -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_79\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\rt.jar;F:\xiangmu3\Xin\Idea\design_pattern\target\classes;D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar" com.geely.design.pattern.creational.singleton.Test
Connected to the target VM, address: '127.0.0.1:4375', transport: 'socket'
结束了!!!
Thread-0===com.geely.design.pattern.creational.singleton.LazySingleton@3eea8847
Disconnected from the target VM, address: '127.0.0.1:4375', transport: 'socket'
Thread-1===com.geely.design.pattern.creational.singleton.LazySingleton@3eea8847

Process finished with exit code 0

 

打印日志2:

Connected to the target VM, address: '127.0.0.1:4782', transport: 'socket'
结束了!!!
Thread-1===com.geely.design.pattern.creational.singleton.LazySingleton@28fa1b85
Thread-0===com.geely.design.pattern.creational.singleton.LazySingleton@57f4ea9d
Disconnected from the target VM, address: '127.0.0.1:4782', transport: 'socket'

Process finished with exit code 0

 

2.3  锁的调用

优点:解决了多线程懒加载初始化的问题。

缺点: 多线程的时候,由于一个线程被锁,其他的线程无法访问该类,被堵塞。性能大大降低

方法1:

package com.geely.design.pattern.creational.singleton;

public class LazySingleton {
    /*
    属性私有,其他外部类,无法调用该属性,安全
     */
    private static LazySingleton lazySingleton = null;

    /**
     * 构造方法私有,其他类无法实例化该类
     */
    private LazySingleton(){
    }

    /**
     * 这里写静态方法:因为外部类无法实例化创建出该类,
     * 只能通过该类的静态方法获取到该类。
     * @return
     */
    public static synchronized LazySingleton getInstance(){
        if(lazySingleton == null){
            lazySingleton = new LazySingleton();
        }
        return lazySingleton;
    }


}

 

方法2:

      public static LazySingleton getInstance(){
          synchronized (LazySingleton.class){
              if(lazySingleton == null){
                  lazySingleton = new LazySingleton();
              }
          }
          return lazySingleton;
    }

 

 

2.4    异步处理注解

@Async

 

2.5    @Async 和 的区别

https://blog.csdn.net/weixin_48207312/article/details/125482428

posted on 2019-08-16 19:23  菜鸟乙  阅读(280)  评论(0编辑  收藏  举报