方式1:使用synchronized关键字实现,未使用lambda
测试环境:eclipse、jdk8
package com.jack.test;
/**
*
* @author jack
*测试经典卖票
*/
class Ticket{
public int number=30;
public synchronized void sales(){
if(number>0){
System.out.println(Thread.currentThread().getName()+"卖出第"+(number--)+"张"+"剩余票数为"+number);
}
}
}
public class ThreadDemo01 {
public static void main(String[] args) {
Ticket ticket=new Ticket();
new Thread(new Runnable(){
@Override
public void run() {
for(int i=0;i<40;i++){
ticket.sales();
System.out.println("我是 AA"+i+"次");
}
}
},"AA").start();
new Thread(new Runnable(){
@Override
public void run() {
for(int i=0;i<40;i++){
ticket.sales();
System.out.println("我是 BB"+i+"次");
}
}
},"BB").start();
new Thread(new Runnable(){
@Override
public void run() {
for(int i=0;i<40;i++){
ticket.sales();
System.out.println("我是 CC"+i+"次");
}
}
},"CC").start();
}
}
方式1:使用ReentrantLock关键字实现和lambda
package com.jack.test;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
*
* @author jack
*测试卖票,lambam
*/
class TicketDemo2{
public int number=30;
public Lock lock=new ReentrantLock();
public void sales(){
try {
lock.lock();
if(number>0){
System.out.println(Thread.currentThread().getName()+"卖出第"+(number--)+"张"+"剩余票数为"+number);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
}
public class ThreadDemo2 {
public static void main(String[] args) {
TicketDemo2 ticket=new TicketDemo2();
new Thread(()->{
for(int i=0;i<40;i++){
ticket.sales();
System.out.println("我是 AA"+i+"次");
}
},"AA").start();
new Thread(()->{
for(int i=0;i<40;i++){
ticket.sales();
System.out.println("我是 BB"+i+"次");
}
},"BB").start();
new Thread(()->{
for(int i=0;i<40;i++){
ticket.sales();
System.out.println("我是 CC"+i+"次");
}
},"CC").start();
}
}