怎么处理JAVA多线程死锁问题?

发布网友

我来回答

2个回答

热心网友

对资源采用同步,还有银行家算法
银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系 银行家算法
统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。   要解释银行家算法,必须先解释操作系统安全状态和不安全状态。   安全序列是指一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。
安全状态
  如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。
不安全状态
  不存在一个安全序列。不安全状态不一定导致死锁。

算法的实现
初始化
  由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。
银行家算法
  在避免死锁的方法中,所施加的*条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。   银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。   设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。   (1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转(2);否则,出错。   (2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i],则转(3);否则,出错。   (3)系统试探分配资源,修改相关数据:   AVAILABLE[i]-=REQUEST[cusneed][i];   ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];   NEED[cusneed][i]-=REQUEST[cusneed][i];   (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
安全性检查算法
  (1)设置两个工作向量Work=AVAILABLE;FINISH   (2)从进程集合中找到一个满足下述条件的进程,   FINISH==false;   NEED<=Work;   如找到,执行(3);否则,执行(4)   (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。   Work+=ALLOCATION;   Finish=true;   GOTO 2   (4)如所有的进程Finish= true,则表示安全;否则系统不安全。

热心网友

现简述如下:
多线程技术是使程序能够同时完成多项任务的一项技术,java语言内置了对多线程技术的支持,多线程可以使程序同时执行多个程序片段。一个程序可以分为多个任务,每个任务都可以分配给一个线程来实现,在java程序启动时,一个进程马上启动,同时该进程会自动启动一个线程的运行,这个线程称为程序的主线程,该主线程控制其他线程的启动,执行各种关闭操作。
java在类与接口方面提供了对线程的内置支持,任何类如果希望以线程的形式运行,都需要实现接口java.lang.Runnable;或者实现java.lang.Thread类。Runnable接口只有一个run()方法,实现给接口只有重写该方法,而Thread类也实现了Runnable接口,但该类有更丰富的方法。常用的方法包括start(),run(),start()方法用于启动线程,而run()方法是线程的主体方法。线程完成的功能代码都写在这个方法里。
例子如下:
public class MyThread1 extends Thread{
public static void main(String [] args){
Thread t=Thread.currentThread();//获得当前主线程的引用
System.out.println("当前主线程是 "+t);
t.setName("MyThread1");//改变当前主线程的名称
System.out.println("当前主线程是 "+t);
MyThread1 m=new MyThread1();//创建了子线程
mt.start();//启动子线程
}
public void run(){
int sum=0;
for(int i=0;i<101;i++){
sum+=i;
}
System.out.println("1+2+3+...="+sum);
}
}
关于进线程的同步问题:
通过线程的优先级可以设置线程占用cpu时间的策略,保证多个线程能合理的顺利的占用cpu时间,执行自己的run()方法,但是如果出现多个线程同时操作一个共享的资源,怎么处理?
为此,java提供了线程的同步机制,所谓同步机制是指两个或多个线程同时访问一个对象时,应该保持数据的统一性与完整性,一旦某个线程获得控制权后,其他的线程只能等待,知道原先的线程放弃对黑盒子的控制。
有时间再说,有事...不懂联系我

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com