多线程之同步与死锁

来源:互联网 发布:建淘宝优惠群网站 编辑:程序博客网 时间:2024/05/20 13:05

方法定义的完整格式。

访问权限{public |default|protected|private}[final][static][synchronized]返回值类型|void 方法名称(参数类型 参数名称,.....)[throws Exception1,Exception2]{return[返回值|返回用处]};

一个多线程的程序如果通过Runnable接口实现的,则意味着类中的属性将被多个线程共享,那么这多个线程要操作同一资源时就有可能出现资源同步问题。

就是假如我手里有三个汉堡,同一刻有四个小盆友来拿,我口头答应的时刻与给他们汉堡的时刻就是时间段。在同一刻时,我答应了他们四个,到了给汉堡的时刻,才发现我只有3个汉堡,这就是资源同步问题。

想解决此类问题,就必须使用同步。所谓的同步就是指多个操作在一个时间段内只有一个线程进行,其他线程等待此线程完成之后才可以继续执行。

解决资源共享的同步操作,可以使用同步代码块和同步方法两种方式完成。

1、同步代码块。

关键字synchronized。

public class MyThread04 implements Runnable {

private int ticket = 5;

@Override

public void run() {

// TODO Auto-generated method stub

for (int i = 0; i < 100; i++) {

synchronized (this) {

if (ticket > 0) {

try {

Thread.sleep(500);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("卖票:ticket=" + ticket--);

}

}

}

}

}

public class SyncDemo02 {

public static void main(String[] args) {

MyThread04 m = new MyThread04();

new Thread(m).start();

new Thread(m).start();

new Thread(m).start();

}

}

2、同步方法

就是使用synchronized关键字将一个方法声明成同步方法。

public class MyThread04 implements Runnable {

private int ticket = 5;
private synchronized void count() {
if (ticket > 0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("卖票:ticket=" + ticket--);
}
}
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 100; i++) {
count();
}
}
}

死锁就是指两个线程都在等待对方先完成,造成了程序的停滞。

多个线程共享同一资源时需要进行同步,以保证资源操作的完整性,但是过多的同步就有可能产生死锁。


1 0