欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

多线程调用单例模式的类的同一个方法,是不是需要排队调用?

程序员文章站 2024-01-26 08:19:40
...

最近在研究多线程,突然想到一个问题,“多线程调用单例模式的类的同一个方法,是不是需要排队调用?”,比如有10个线程同时调用一个单例模式类的同一个方法,他们是第一个调完再轮到第二个调,还是10个线程同时可以调用这个方法?想出这种问题肯定是对java的基础知识掌握的不好,在网上找了很多帖子,但看下来都很懵懂,也发现有很多人和我有一样的问题,所以我自己写了代码,模拟这种情况,代码如下。

1.单例模式的类

public class MySingleton {
	private static MySingleton instance = new MySingleton();

	private MySingleton() {
	}

	public static MySingleton getInstance() {
		return instance;
	}

	public static void printName(String name) {
		System.out.println(name+"开始调用");
		try {
			Thread.sleep(300);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(name+"结束调用");
	}
}

2.实现了 Runnable的类

public class NameThread implements Runnable {

	String name;
	
	public NameThread(String name) {
		this.name = name;
	}
	
	@Override
	public void run() {
		MySingleton.printName(name);
	}

}

3.测试类

	public static void main(String[] args) throws InterruptedException {
		
		Thread[] ts = new Thread[20];//同时开20个线程
		for(int i = 0 ; i < ts.length ; i++){
			NameThread m = new NameThread("thread:"+i);
			ts[i]=new Thread(m);
		}
		
		for(int i = 0 ; i < ts.length ; i++){  
			ts[i].start();
		}
		
	}

最后打印的结果:

thread:0开始调用
thread:1开始调用
thread:2开始调用
thread:3开始调用
thread:4开始调用
thread:5开始调用
thread:6开始调用
thread:8开始调用
thread:7开始调用
thread:9开始调用
thread:11开始调用
thread:10开始调用
thread:12开始调用
thread:14开始调用
thread:15开始调用
thread:13开始调用
thread:16开始调用
thread:18开始调用
thread:17开始调用
thread:19开始调用
thread:0结束调用
thread:5结束调用
thread:4结束调用
thread:3结束调用
thread:2结束调用
thread:1结束调用
thread:10结束调用
thread:11结束调用
thread:9结束调用
thread:7结束调用
thread:8结束调用
thread:6结束调用
thread:15结束调用
thread:13结束调用
thread:14结束调用
thread:12结束调用
thread:16结束调用
thread:19结束调用
thread:17结束调用
thread:18结束调用

所以,最后得出的结论就是,多线程调用单利模式类的同一个方法是不用排队的,是同时一起调用的