您的位置:首页 > 其它

同步与死锁的问题

2011-12-09 11:50 183 查看
比如一个卖票程序,如果多线程同时操作时,就有可能出现卖出票为负数的问题。

例子:用Runnable接口实现多线程,并产生3个线程对象。同时卖五张票

package test2;

class MyThread11 implements Runnable {
private int ticket = 5;

public void run() {
for (int i = 0; i < 100; i++) {
if (ticket > 0) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.println("卖票:ticket=" + ticket--);
}
}
}
}

public class SyncDemo01 {
public static void main(String[] args) {
MyThread11 mt = new MyThread11();
Thread t1 = new Thread(mt);
Thread t2 = new Thread(mt);
Thread t3 = new Thread(mt);
t1.start();
t2.start();
t3.start();
}
}


  结果:

卖票:ticket=5
卖票:ticket=4
卖票:ticket=3
卖票:ticket=2
卖票:ticket=1
卖票:ticket=0
卖票:ticket=-1

出现了-1,所以就引出同步代码块

【同步代码块】

synchronized(同步对象){需要同步的代码}

范例:

package test2;

class MyThread11 implements Runnable {
private int ticket = 5;

public void run() {
for (int i = 0; i < 100; i++) {
synchronized (this) {
if (ticket > 0) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.println("卖票:ticket=" + ticket--);
}
}

}
}
}

public class SyncDemo01 {
public static void main(String[] args) {
MyThread11 mt = new MyThread11();
Thread t1 = new Thread(mt);
Thread t2 = new Thread(mt);
Thread t3 = new Thread(mt);
t1.start();
t2.start();
t3.start();
}
}


  结果:

卖票:ticket=5
卖票:ticket=4
卖票:ticket=3
卖票:ticket=2
卖票:ticket=1

这样就可以避免买票出现负数的问题!!!

还有一个方法是同步方法:

【同步方法】

synchronized 方法返回值 方法名称(参数列表){}

package test2;

class MyThread11 implements Runnable {
private int ticket = 5;

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

this.sale1();

}
}

public synchronized void sale1() {
if (ticket > 0) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("卖票:ticket=" + ticket--);
}
}

}

public class SyncDemo01 {
public static void main(String[] args) {
MyThread11 mt = new MyThread11();
Thread t1 = new Thread(mt);
Thread t2 = new Thread(mt);
Thread t3 = new Thread(mt);
t1.start();
t2.start();
t3.start();
}
}


  

  结果:

卖票:ticket=5
卖票:ticket=4
卖票:ticket=3
卖票:ticket=2
卖票:ticket=1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: