同步鎖
阿新 • • 發佈:2020-12-22
-
多個執行緒訪問同一個物件叫併發。
-
執行緒同步就是:排隊
-
-
synchronized,當一個執行緒獲得物件的排它鎖,獨佔資源,其他執行緒必須等待,使用夠釋放鎖即可。
-
程式碼塊鎖可以鎖任何地方。
package Thread;
public class UnsafyBuyTickets {
public static void main(String[] args) {
BuyTicket buyTicket = new BuyTicket();
new Thread(buyTicket,"明").start();
new Thread(buyTicket,"剛").start();
new Thread(buyTicket,"老闆").start();
}
}
class BuyTicket implements Runnable{
private int tickets = 10;
boolean falg = true;
@Override
public void run() {
//買票
while(falg){
buy();
}
}
private synchronized void buy(){
//判斷是否有票
if (tickets<=0){
falg = false;
return;
}
//模擬程式碼延時
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"拿到"+tickets--+"張票");
}
}package Thread;
public class UnsafyBank {
public static void main(String[] args) {
Account account = new Account(2000000,"彩禮");
Drawing you = new Drawing(account,1000000,"自己");
Drawing wife = new Drawing(account,2000000,"妻子");
you.start();
wife.start();
}
}
class Account {
int money;
String name;
public Account(int money,String name){
this.money = money;
this.name = name;
}
}
//模擬:銀行取款
class Drawing extends Thread{
Account account;//賬戶
int drawingMoney;//取了多少錢
String name;
//現在手裡有多少錢
int nowMoney;
public Drawing(Account account,int drawingMoney,String name){
super(name);
this.account = account;
this.drawingMoney = drawingMoney;
this.nowMoney = nowMoney;
}
@Override
public void run() {
//鎖的對物件是變化的量,需要增刪改操作的量。
synchronized (account){
if(account.money-drawingMoney<0){
System.out.println(Thread.currentThread().getName()+"錢不夠,取不了");
return;
}
//模擬延時
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
account.money = account.money-drawingMoney;
nowMoney = nowMoney+drawingMoney;
System.out.println(account.name+"餘額為"+account.money);
System.out.println(this.getName()+"手裡的錢:"+nowMoney);
}
}
}package Thread;
import java.util.ArrayList;
import java.util.List;
public class UnSafyList {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
for (int i = 0; i < 10000; i++) {
new Thread(() -> {
synchronized (list) {
list.add(Thread.currentThread().getName());
}
}).start();
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(list.size());
}
}
-