和镜像网站做友链,环保局网站建设,响应式网页设计技巧,建设银行成都开发中心网站同步方法及同步块
接上期三大不安全案例#xff0c;本期将介绍同步方法和同步块#xff0c;以期达到安全的目的。
车站买票#xff1a;加入了synchronized 同步方法
package syn;
//不安全的买票
//线程不安全#xff0c;有负数
public class UnsafeBuyTicket {publi…同步方法及同步块
接上期三大不安全案例本期将介绍同步方法和同步块以期达到安全的目的。
车站买票加入了synchronized 同步方法
package syn;
//不安全的买票
//线程不安全有负数
public class UnsafeBuyTicket {public static void main(String[] args) {BuyTicket buyTicket new BuyTicket();new Thread(buyTicket,xiaoming).start();new Thread(buyTicket,xiaozhang).start();new Thread(buyTicket,xiaowang).start();
}
}
class BuyTicket implements Runnable{//票private int ticketNums 10;boolean flag true;Overridepublic void run() {//买票while (flag){buy();}}//synchronized 同步方法锁的是thisprivate synchronized void buy(){//判断是否有票if(ticketNums0){flagfalse;return;}//模拟延时try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}//买票System.out.println(Thread.currentThread().getName()拿到第ticketNums--张票);}
} 银行取钱加入了synchronized 同步块
package syn;
//不安全的取钱
//两个人去银行取钱账户
public class UnsafeBank {public static void main(String[] args) {//账户Account account new Account(100,基金);
Drawing you new Drawing(account,50,你);Drawing girl new Drawing(account,100,girl);
you.start();girl.start();
}
}
//账户
class Account{int money;//余额String name;//卡名public Account(int money,String name){this.moneymoney;this.namename;}
}
//银行模拟取款
class Drawing extends Thread{Account account;//账户//取了多少钱int drawingMoney;//现在手里有多少钱int nowMoney;
public Drawing(Account account,int drawingMoney,String name){super(name);this.accountaccount;this.drawingMoneydrawingMoney;}//取钱//synchronized默认锁的是thisOverridepublic void run() {//锁的对象应该是变化的量需要增删改的对象synchronized (account){//判断有没有钱if (account.money-drawingMoney0){System.out.println(Thread.currentThread().getName()钱不够取不了);return;}//sleep可以放大问题发生性try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}//卡内余额 余额 - 你取的钱account.money account.money - drawingMoney;//你手里的钱nowMoney nowMoney drawingMoney;System.out.println(account.name余额为account.money);System.out.println(this.getName()手里的钱nowMoney);}
}
} 安全集合
package syn;
import java.util.ArrayList;
import java.util.List;
//线程不安全的集合
public class UnsafeList {public static void main(String[] args) {ListString list new ArrayListString();for (int i 0; i 10000; i) {new Thread(()-{synchronized (list){list.add(Thread.currentThread().getName());};
}).start();}try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(list.size());}
} 注意锁的对象应该是变化的量需要增删改的对象
CopyOnWriteArrayList
package syn;
import java.util.concurrent.CopyOnWriteArrayList;
//测试JUC安全类型的集合
public class TestJUC {public static void main(String[] args) {CopyOnWriteArrayListString list new CopyOnWriteArrayListString();for (int i 0; i 1000; i) {new Thread(()-{list.add(Thread.currentThread().getName());
}).start();}try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(list.size());}
}