将一个任务拆分成多个独立执行的子任务,这些子任务可以并行执行,而你却不需要为这些子任务如何并行执行浪费过多的心思,想想是一件多么令人心旷神怡的事情,有的人可能说,“喂,起始这些子任务实际上并不是并行执行”,但,多线程可以同时执行一个以上的线程,且每个线程都像独立运行一般,处理器时间的分配让大多数动作完成自己的任务,使用者的每个操作能及时得到正确响应,才是最主要的
多线程技术应用常见的问题之一就是资源共享的问题,打个比方来说,如果如果有个美女是你女朋友,突然来个男人告诉你,这个女人是他的女朋友,这个时候想想你的表情多么惊讶。又如,你在大街上散步,突然看到前面有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,那么要么是你疯了,要么是使用者疯了