JAVA线程-1_卖票
讨论区
- 这段代码是从博文上看来的,也算是自己刚开始看线程的启蒙代码
- 下面是自己的测试点
- 如果不加synchronized对类进行同步块,那么就会使线程ABC同时获取到tickets数量,即同一时刻获取同一个tickets的内存数据(重复票)
- 待补充(我也不知道该讲什么)
代码区-1-synchronized
public class Demo1 {
private int tickets = 100;
void sell() {
while (tickets > 0) {
synchronized (this) {
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + " "+ tickets);
tickets--;
}
}
try {
Thread.currentThread().sleep(500l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " have sold out...");
}
public static void main(String[] args) {
final Demo1 demo1 = new Demo1();
Thread sellA = new Thread(new Runnable() {
@Override
public void run() {
demo1.sell();
}
});
sellA.setName("SellerA");
Thread sellB = new Thread(new Runnable() {
@Override
public void run() {
demo1.sell();
}
});
sellB.setName("SellerB");
Thread sellC = new Thread(new Runnable() {
@Override
public void run() {
demo1.sell();
}
});
sellC.setName("SellerC");
sellA.start();
sellB.start();
sellC.start();
}
}
代码区-2-ReentrantLock
package tmp1;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Demo1 {
private int tickets = 100;
private Lock lock = new ReentrantLock();
void sell() {
while (tickets > 0) {
lock.lock();
try {
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + " "+ tickets);
tickets--;
}
} catch (Exception e) {
}finally{
lock.unlock();
}
try {
Thread.currentThread().sleep(500l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " have sold out...");
}
public static void main(String[] args) {
final Demo1 demo1 = new Demo1();
Thread sellA = new Thread(new Runnable() {
@Override
public void run() {
demo1.sell();
}
});
sellA.setName("SellerA");
Thread sellB = new Thread(new Runnable() {
@Override
public void run() {
demo1.sell();
}
});
sellB.setName("SellerB");
Thread sellC = new Thread(new Runnable() {
@Override
public void run() {
demo1.sell();
}
});
sellC.setName("SellerC");
sellA.start();
sellB.start();
sellC.start();
}
}
运行截图区