JAVA多线程之资源共享

将一个任务拆分成多个独立执行的子任务,这些子任务可以并行执行,而你却不需要为这些子任务如何并行执行浪费过多的心思,想想是一件多么令人心旷神怡的事情,有的人可能说,“喂,起始这些子任务实际上并不是并行执行”,但,多线程可以同时执行一个以上的线程,且每个线程都像独立运行一般,处理器时间的分配让大多数动作完成自己的任务,使用者的每个操作能及时得到正确响应,才是最主要的

 

多线程技术应用常见的问题之一就是资源共享的问题,打个比方来说,如果如果有个美女是你女朋友,突然来个男人告诉你,这个女人是他的女朋友,这个时候想想你的表情多么惊讶。又如,你在大街上散步,突然看到前面有100元,正当你弯腰要捡的时候钱却不见了!想想这些事情发生时候是多么的疯狂,所以,你必须声明这个美女是你的女朋友,在你和她没分手之前,不想和任何人共享,你在捡钱的时候可以大声喊“这100元是我的了”,将这些资源锁定,JAVA资源共享这是为解决这类问题而产生的,当然抽象到编程语言中了

 

 

1.方法同步,你可以将一个函数声明为synchronized函数,例如

synchronized void a(){}
synchronized void b(){}

 这样当你调用任何synchronized函数时,对象被锁定,改对象的所有synchronize函数便无法被调用,直到第一个函数执行完并且解除锁定为止,这种机制使用的是对象的锁(lock),不过线程可以唤起多个对象的synchronize函数,如果想要保护一个资源避免被多个线程同时使用,那么你可以强迫程序使用synchronized函数访问该资源

 

public synchronized static String setName(Object o){
		String t = o.getClass().toString();
		if(t.indexOf("class") != -1){
			t = t.substring(6);
		}
		return t;
}
	
public synchronized static void setupClosing(JFrame frame){
		frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
}

 

 这样同一个对象的setupClosing()函数与setTitle()函数则不能同时被执行,因为只有一个锁,比如说当你抱着一个美女时,不允许任何一个在来对这个美女做任何动作,因为你现在是独占模式,除非你放开这个美女,即释放资源

 

2.同步区块,如

synchronized(this){
	Container c = getContentPane();
}

 表示,你必须具有这个对象的机锁,才可以进入这个区块,此种操作通常用于隔开程序的关键区

 

 锁定效率一般是你进入方法、离开方法所需时间的4倍(不包括执行程序主体所需时间) ,所以你必须慎重选择synchronized,当然你如果你为了效率而在多线程环境下不用synchronized,那么要么是你疯了,要么是使用者疯了

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值