1.不加锁
public class Threads implements Runnable {
// 定义去北京火车票
private Integer tickets = 10;
// 定义去武汉火车票
private Integer tic = 10;
// 定义锁对象
private Lock lock = new ReentrantLock();
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets-- + "张票");
}
} catch (Exception e) {
e.printStackTrace();
}
try {
// lock.lock(); //加锁
Thread.sleep(1000);
if (tic > 0) {
System.out.println(Thread.currentThread().getName() + "-------->>>>>>正在出售第" + tic-- + "张票");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//lock.unlock();//释放锁
}
}
}
public static void main(String[] args) {
Threads s = new Threads();
Thread t1 = new Thread(s, "窗口1");
Thread t2 = new Thread(s, "窗口2");
Thread t3 = new Thread(s, "窗口3");
Thread t4 = new Thread(s, "窗口4");
Thread t5 = new Thread(s, "窗口5");
Thread t6 = new Thread(s, "窗口6");
Thread t7 = new Thread(s, "窗口7");
Thread t8 = new Thread(s, "窗口8");
Thread t9 = new Thread(s, "窗口9");
Thread t10 = new Thread(s, "窗口10");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
t7.start();
t8.start();
t9.start();
t10.start();
}
}
1.都在疯狂超卖
2.锁住线程整个方法
/**
* @author : zhang sq
* @date : 2019/9/26 9:22
* 线程锁
**/
public class Threads implements Runnable {
// 定义去北京火车票
private Integer tickets = 15;
// 定义去武汉火车票
private Integer tic = 15;
// 定义锁对象
private Lock lock = new ReentrantLock();
@Override
public void run() {
while (true) {
try {
lock.lock(); //加锁
Thread.sleep(1000);
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets-- + "张票");
}
} catch (Exception e) {
e.printStackTrace();
}
try {
Thread.sleep(1000);
if (tic > 0) {
System.out.println(Thread.currentThread().getName() + "-------->>>>>>正在出售第" + tic-- + "张票");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock(); //释放锁
}
}
}
public static void main(String[] args) {
Threads s = new Threads();
Thread t1 = new Thread(s, "窗口1");
Thread t2 = new Thread(s, "窗口2");
Thread t3 = new Thread(s, "窗口3");
Thread t4 = new Thread(s, "窗口4");
Thread t5 = new Thread(s, "窗口5");
Thread t6 = new Thread(s, "窗口6");
Thread t7 = new Thread(s, "窗口7");
Thread t8 = new Thread(s, "窗口8");
Thread t9 = new Thread(s, "窗口9");
Thread t10 = new Thread(s, "窗口10");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
t7.start();
t8.start();
t9.start();
t10.start();
}
}
2.结果: 没得问题
3.锁住下半段
public void run() {
while (true) {
try {
Thread.sleep(1000);
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets-- + "张票");
}
} catch (Exception e) {
e.printStackTrace();
}
try {
lock.lock(); //加锁
Thread.sleep(1000);
if (tic > 0) {
System.out.println(Thread.currentThread().getName() + "-------->>>>>>正在出售第" + tic-- + "张票");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();//释放锁
}
}
}
3.结果上面超卖,下面没超卖
4.锁住上半段
@Override
public void run() {
while (true) {
try {
lock.lock(); //加锁
Thread.sleep(1000);
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets-- + "张票");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();//释放锁
}
try {
Thread.sleep(1000);
if (tic > 0) {
System.out.println(Thread.currentThread().getName() + "-------->>>>>>正在出售第" + tic-- + "张票");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.都挺好,都没有超卖.(???因为上半段只能进一个线程,导致下半段安全? 求大佬解答)
.
求教!对于下订单 里面业务复杂库存容易超卖, 是只需要锁住下单方法中减库存那一块的方法?还是锁住整个下订单方法?