1700451182
编写高质量代码:改善Java程序的151个建议 建议128:预防线程死锁
1700451183
1700451184
线程死锁(DeadLock)是多线程编码中最头疼的问题,也是最难重现的问题,因为Java是单进程多线程语言,一旦线程死锁,则很难通过外科手术式的方法使其起死回生,很多时候只有借助外部进程重启应用才能解决问题。我们看看下面的多线程代码是否会产生死锁:
1700451185
1700451186
class Foo implements Runnable{
1700451187
1700451188
public void run(){
1700451189
1700451190
//执行递归函数
1700451191
1700451192
fun(10);
1700451193
1700451194
}
1700451195
1700451196
//递归函数
1700451197
1700451198
public synchronized void fun(int i){
1700451199
1700451200
if(—i>0){
1700451201
1700451202
for(int j=0;j<i;j++){
1700451203
1700451204
System.out.print(”*”);
1700451205
1700451206
}
1700451207
1700451208
System.out.println(i);
1700451209
1700451210
fun(i);
1700451211
1700451212
}
1700451213
1700451214
}
1700451215
1700451216
}
1700451217
1700451218
注意fun方法是一个递归函数,而且还加上了synchronized关键字,它保证同时只有一个线程能够执行,想想synchronized关键字的作用:当一个带有synchronized关键字的方法在执行时,其他synchronized方法会被阻塞,因为线程持有该对象的锁。比如有这样的代码:
1700451219
1700451220
static class Foo{
1700451221
1700451222
public synchronized void m1(){
1700451223
1700451224
try{
1700451225
1700451226
Thread.sleep(1000);
1700451227
1700451228
}catch(InterruptedException e){
1700451229
1700451230
//异常处理
[
上一页 ]
[ :1.700451181e+09 ]
[
下一页 ]