本文主要为了测试一下在单例模式非静态函数与静态函数能能否被多个线程同时访问。
维护的项目很多地方用到了单例模式?使用单例模式给人的感觉就是多个线程访问的时候,因为都是访问的同一个对象,比如add与get访问的时候感觉会阻塞成调用的队列一个个执行。其实仔细想想,单例模式就是new个对象,这个普通的对象线程安全是绝对没有保障的(只是单例有点障眼法的意思)。
实际测试结果正好相反单例模式不能保证线程安全,单例模式应用场景是什么呢?(以后想通了在补充这部分)
与单例类似功能的是static静态函数,因为附属与类,给人的感觉也是单个的实例,这种函数是线程安全的吗?
结果与单例模式一样也不是线程安全的。(这里应该学习下java调用函数的详细过程,可能就会很明了了,现在不知道的情况下,可以通过实验得到结果)
代码如下:
package instance;
import java.util.concurrent.CountDownLatch;
/**
* 验证static函数是否可以同时被两个线程访问,instance模式下的函数能否被并行访问?
* @author zmyself
*
*/
public class InstanceStaticDemo extends Thread{
/**访问非静态函数运行结果
Thread-0 call me(b.f2) Now------start
Main call me(b.f2) Now------start
Thread-0 call me(b.f2) Now------End
Main call me(b.f2) Now------End
静态函数的运行结果,访问的相同的实例与单例模式一样
Thread-0 call me(b.f1) Now -----start
Main call me(b.f1) Now -----start
Thread-0 call me(b.f1) now ------End
Main call me(b.f1) now ------End
*/
public static void main(String[] args)
{
B b = new B();
CountDownLatch l = new CountDownLatch(1);
InstanceStaticDemo isd = new InstanceStaticDemo(l,b);
isd.start();
try {
l.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Thread.currentThread().yield();
// b.f2("Main ");
B.f1("Main ");
}
private B b = null;
private CountDownLatch l;
public InstanceStaticDemo(CountDownLatch l,B b)
{
this.l = l;
this.b = b;
}
public void run()
{
l.countDown();
B.f1(this.getName());
}
}
对象B
package instance;
public class B {
//静态函数
public static void f1(String whoCallMe)
{
System.out.println(whoCallMe+" call me(b.f1) Now -----start");
try {
Thread.currentThread().sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(whoCallMe+" call me(b.f1) now ------End");
}
//非静态函数
public void f2(String whoCallMe)
{
System.out.println(whoCallMe+" call me(b.f2) Now------start");
try {
Thread.currentThread().sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(whoCallMe+" call me(b.f2) Now------End");
}
}