同步问题引出
在多线程的处理之中,可以利用Runnable描述多个线程操作的资源,而Thread描述每一个线程对象,于是当多个线程访问统一资源的时候如果处理不当就会产生数据的错误操作。
下面编写一个简单的卖票程序,将创建若干个线程对象实现实现卖票的处理操作。
范例:实现卖票操作
package cn.mldn.demo;
class MyThread implements Runnable {
private int ticket = 10; // 总票数为10张
@Override
public void run() {
while(true) {
if (this.ticket > 0) {
System.out.println(Thread.currentThread().getName() + "卖票,ticket = " + this.ticket --);
} else {
System.out.println("****** 票已经卖光了 *******");
break ;
}
}
}
}
public class TreadDemo {
public static void main(String[] args) throws Exception {
MyThread mt = new MyThread() ;
new Thread(mt,"漂板子A").start();
new Thread(mt,"漂板子B").start();
new Thread(mt,"漂板子C").start();
}
}
漂板子A卖票,ticket = 10
漂板子B卖票,ticket = 8
漂板子C卖票,ticket = 9
漂板子B卖票,ticket = 6
漂板子C卖票,ticket = 5
漂板子B卖票,ticket = 4
漂板子A卖票,ticket = 7
漂板子B卖票,ticket = 2
****** 票已经卖光了 *******
漂板子C卖票,ticket = 3
****** 票已经卖光了 *******
漂板子A卖票,ticket = 1
****** 票已经卖光了 *******
此时的程序将创建三个线程对象,并且这三个线程对象将进行5张票的出售。此时的程序在进行卖票处理的时候并没有任何的问题(假象),下面就可以模拟一下卖票中的延迟操作。
package cn.mldn.demo;
class MyThread implements Runnable {
private int ticket = 10; // 总票数为10张
@Override
public void run() {
while(true) {
if (this.ticket > 0) {
try {
Thread.sleep(100); // 模拟网络延迟
}