简单多线程和单例学习例一

这是一个简单的面试题:

  写一个简单的单例和多线程结合的例子;



代码:

单例代码:    

public class Singleton {
    private int i = 0;
    //在类内部实例化单例, 将会在虚拟机启动加载类的时候加载该静态实例
    private static Singleton singleton = new Singleton();
    //自由化构造函数,以确保不会被外部类实例化
    private Singleton() {
        System.out.println("初始化单例!");
    }
    //获取该类内部静态实例方法
    public static Singleton getSingleton () {
        return singleton;
    }

    public int getI() {
        return i;
    }

    public void setI(int i) {
        this.i = i;
    }
}

线程继承类:

public class MyThread extends Thread {
    private Singleton singleton;
    //构造方法
    MyThread (Singleton singleton) {
        this.singleton = singleton;
        System.out.println("初始化线程!");
    }

    @Override
    public void run() {
        super.run();
        singleton.setI(singleton.getI() + 1);
        System.out.println(singleton.getI());
    }
}

测试类:

public class Run {
    public static void main (String[] args) {
        Singleton singleton = Singleton.getSingleton();
        //生成线程实例-1
        MyThread thread1 = new MyThread(singleton);
        //生成线程实例-2
        MyThread thread2 = new MyThread(singleton);
        //生成线程实例-3
        MyThread thread3 = new MyThread(singleton);
        //生成线程实例-4
        MyThread thread4 = new MyThread(singleton);
        //启动线程-1
        thread1.start();
        //启动线程-2
        thread2.start();
        //启动线程-3
        thread3.start();
        //启动线程-4
        thread4.start();
    }
}

测试类输出:

初始化单例!
初始化线程!
初始化线程!
初始化线程!
初始化线程!
1
2
3
4

分析 :

1. 这里看到单例只被实例化了一次, 这是单例模式的特性, 并且多个线程见共享着单例实例;

2. 继承Thread是多线程实现的简单方法之一, 但是因为Java是单继承, 所以如果是已经继承其它类的类, 那么就可以通过实现 Runnable接口来实现;

原文地址:https://www.cnblogs.com/kns2017/p/9388028.html

时间: 2024-10-15 10:40:02

简单多线程和单例学习例一的相关文章

JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是class对象 我们在上节验证了同步函数的锁是this,但是对于静态同步函数,你又知道多少呢? 我们做一个这样的小实验,我们给show方法加上static关键字去修饰 private static synchronized void show() { if (tick > 0) { try { Thread

简单工厂和单例的一些事

一:简单工厂(使用计算器例子进行描述概括) 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类或接口.简单工厂模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,通常根据一个条件(参数)来返回不同的类的实例. 效果如图所示: //父类 public abstract class Operation { public double NumberA { get; set; } public double NumberB { get;

多线程练习 -- 单例设计模式

Singleton.h #define singleton_h(name) + (instancetype)shared##name; #if __has_feature (objc_arc) #define singleton_m(name) static id _instance; + (id)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^

【java学习】Servlet简单的表单程序(一)

此文用于java学习,在此小记. 在此小Demo中使用到了Servlet,所以有必要了解一下Servlet的相关知识.(Servlet的相关知识摘抄自http://blog.csdn.net/jiuqiyuliang/article/details/36424981) Servlet是Sun公司提供的一门用于开发动态web网页的技术.Sun公司在API中提供了一个servlet接口,我们如果想使用java程序开发一个动态的web网页,只需要实现servelet接口,并把类部署到web服务器上就可

单例多例

单例多例需要搞明白两个问题:1. 什么是单例多例:2. 如何产生单例多例:3. 为什么要用单例多例4. 什么时候用单例,什么时候用多例:1. 什么是单例多例:所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action; 2. 如何产生单例多例:    在通用的SSH中,单例在spring中是默认的,如果要产生多例,则在配置文件的bean中添加scope="prototype"; 3. 为

web 单例 多例

单例多例需要搞明白两个问题:1. 什么是单例多例:2. 如何产生单例多例:3. 为什么要用单例多例4. 什么时候用单例,什么时候用多例:1. 什么是单例多例:所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action; 2. 如何产生单例多例:    在通用的SSH中,单例在spring中是默认的,如果要产生多例,则在配置文件的bean中添加scope="prototype"; 3. 为

Spring中构造器、init-method、@PostConstruct、afterPropertiesSet孰先孰后,自动注入发生时间以及单例多例的区别

首先明白,spring的IOC功能需要是利用反射原理,反射获取类的无参构造方法创建对象,如果一个类没有无参的构造方法spring是不会创建对象的.在这里需要提醒一下,如果我们在class中没有显示的声明构造方法,默认会生成一个无参构造方法,但是当我们显示的声明一个有参构造方法的时候,JVM不会帮我们生成无参构造方法,所以我们声明一个带参数的构造方法也需要声明一个无参构造方法.(题外话:如果父类声明一个有参构造方法,子类需要在构造方法第一行显示的调用父类构造方法,因为子类的对象也是父类的对象,所以

JAVA web学习例程源码分享

JAVA web学习例程源码分享JAVA web学习例程源码分享我自己也从里面学习到了很多东西! 1.BBS论坛系统(jsp+sql)2.ERP管理系统(jsp+servlet)3.OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR)4.博客系统(struts+hibernate+spring)5.车辆管理系统(struts+hibernate+spring+oracle)6.家庭理财系统(java+applet)7.教材订购系统(jsp+servlet

delphi之多线程编程(尚未学习)

本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅.所有代码均亲自测试 delphi7下测试有效.图片均为自己制作. 多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以仅仅是看上去会一些,明白了2+2的时候,其实我还不知道1+1. 开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解.先试试这个:  procedure TForm1.Button1Click(Sender: TObject); var   i: Integer; begin