单例模式与静态函数能否保证并行访问数据的安全。



本文主要为了测试一下在单例模式非静态函数与静态函数能能否被多个线程同时访问。


维护的项目很多地方用到了单例模式?使用单例模式给人的感觉就是多个线程访问的时候,因为都是访问的同一个对象,比如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");
			
		}
}



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值