电影售票演示线程安全问题
1.实现电影票重票、缺票、负票问题
public class sellTickets {
public static void main(String[] args) {
sellRunnable st = new sellRunnable();
Thread t1 = new Thread(st,"窗口1");
Thread t2 = new Thread(st,"窗口2");
Thread t3 = new Thread(st,"窗口3");
Thread t4 = new Thread(st,"窗口4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
public class sellRunnable implements Runnable{
int tickets = 100;
@Override
public void run() {
while (true){
if (tickets < 1){
break;
}
try {
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");
tickets--;
}
}
}
2.同步代码块方式
public class sellRunnable implements Runnable{
int tickets = 100;
@Override
public void run() {
while (true){
synchronized ("test"){
if (tickets < 1){
break;
}
try {
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");
tickets--;
}
}
}
}
3.同步方法
public class sellRunnable implements Runnable{
int tickets = 100;
@Override
public void run() {
while (true){
if (sellTickets()) break;
}
}
private synchronized boolean sellTickets() {
if (tickets < 1){
return true;
}
try {
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");
tickets--;
return false;
}
}
4.lock锁
lock锁机制提供了synchronized代码块和synchronized方法
public void lock()加同步锁
public void unlock()释放同步锁
public class sellRunnableLock implements Runnable{
int ticket = 100;
Lock lock = new ReentrantLock();
@Override
public void run() {
while (true){
lock.lock();
if (ticket < 1){
lock.unlock();
break;
}
try {
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第"+ticket+"张票");
ticket--;
lock.unlock();
}
}
}