解决多线程当中共享资源冲突的问题
1. 冲突问题展示:
/*
* 共享资源冲突的问题
*/
class SingleThread implements Runnable {
// 共享资源,100张票
private static int ticket = 100;
@Override
public void run() {
while (true) {
if (ticket > 0) {
System.out.println(Thread.currentThread().getName() +
"售出了第" + ticket + "张票");
ticket -= 1;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
System.out.println(Thread.currentThread().getName() +
"售罄!!!");
break;
}
}
}
}
public class Demo1 {
public static void main(String[] args) {
Thread thread = new Thread(new SingleThread(),"淘票票");
Thread thread2 = new Thread(new SingleThread(),"猫眼");
Thread thread3 = new Thread(new SingleThread(),"美团");
thread.start();
thread2.start();
thread3.start();
}
}
从上面的例子上可以看到,最后一张票被每一个平台都卖了一次,这样子肯定是不符合实际情况的,这就是本次我们需要解决的问题。
2. 解决方法:
2.1 同步代码块
- 格式:
synchronized ("锁") {
//需要同步的代码
}
- 特征:
a: synchronized关键字后面的小括号里面的对象是锁对象