同步代码块方式
public class RunnableImpl implements Runnable {
private int ticket = 100;
@Override
public void run() {
while (true){
try {
Thread.sleep(500);
}catch (InterruptedException e){
e.printStackTrace();
}
synchronized (this){
if (ticket <= 0){
break;
}
String name = Thread.currentThread().getName();
System.out.println(name+"正在卖出第" +(100-ticket+1)+"张票。还剩余"+(--ticket)+"张");
}
}
}
}
同步方法的方式
public class RunnableImpl implements Runnable {
private int ticket = 100;
@Override
public void run() {
method();
}
private static synchronized void method() {
while (true){
try {
Thread.sleep(500);
}catch (InterruptedException e){
e.printStackTrace();
}
if (ticket <= 0){
break;
}
String name = Thread.currentThread().getName();
System.out.println(name+"正在卖出第" +(100-ticket+1)+"张票。还剩余"+(--ticket)+"张");
}
}
}
Lock锁的方式
public class RunnableImpl implements Runnable {
private int ticket = 100;
Lock l = new ReentrantLock();
@Override
public void run() {
while (true){
try {
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
l.lock();
if (ticket <= 0){
l.unlock();
break;
}
try {
Thread.sleep(100);
String name = Thread.currentThread().getName();
System.out.println(name+"正在卖出第" +(100-ticket+1)+"张票。还剩余"+(--ticket)+"张");
}catch (InterruptedException e){
e.printStackTrace();
}finally {
l.unlock();
}
}
}
}