這里使用ambda運算式(引數)->{代碼}
首先是沒有鎖的情況下多個執行緒爭奪同一個資源的情況
package com.zheng;
//執行緒就是一個單獨的資源類
public class BuyTicket {
public static void main(String[] args) {
Ticket ticket = new Ticket();
//并發:多執行緒操作同一個資源類,把資源類丟入執行緒
//lambda運算式(引數)->{代碼}
new Thread(()->{
for (int i = 0; i < 30; i++) {
ticket.sale();
}
},"A").start();
new Thread(()->{
for (int i = 0; i < 30; i++) {
ticket.sale();
}
},"B").start();
new Thread(()->{
for (int i = 0; i < 30; i++) {
ticket.sale();
}
},"C").start();
}
}
//資源類
class Ticket{
//屬性和方法
private int num = 20;
public void sale(){
if(num > 0){
System.out.println(Thread.currentThread().getName()+"賣出了"+(num--)+"票,剩余:"+num);
}
}
}
測驗結果


公平鎖:誰先來誰先執行
非公平鎖:可以插隊(默認)
加鎖后
package com.zheng;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//執行緒就是一個單獨的資源類
public class BuyTicket {
public static void main(String[] args) {
Ticket ticket = new Ticket();
//并發:多執行緒操作同一個資源類,把資源類丟入執行緒
//lambda運算式(引數)->{代碼}
new Thread(()->{
for (int i = 0; i < 30; i++) {
ticket.sale();
}
},"A").start();
new Thread(()->{
for (int i = 0; i < 30; i++) {
ticket.sale();
}
},"B").start();
new Thread(()->{
for (int i = 0; i < 30; i++) {
ticket.sale();
}
},"C").start();
}
}
//資源類
class Ticket{
//屬性和方法
private int num = 20;
Lock lock = new ReentrantLock();
public void sale(){
lock.lock();//加鎖
try {
//業務代碼
if(num > 0){
System.out.println(Thread.currentThread().getName()+"賣出了"+(num--)+"票,剩余:"+num);
}
} catch (Exception e) {
lock.unlock();
}
}
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/395445.html
標籤:其他
下一篇:計算機網路點對點協議PPP
