锁
-
synchronized默认的锁this(用在方法修饰符后面)
-
如果要锁其他的内容要用synchronized块
-
锁的对象是变化的量
package syn;
//数组
import java.util.ArrayList;
public class UnsafeList {
public static void main(String[] args) throws InterruptedException {
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < 10000; i++) {
new Thread(()->{
synchronized (list) {
list.add(Thread.currentThread().getName());
}
}).start();
}
Thread.sleep(3000);
System.out.println(list.size());
}
}
package syn;
//银行同时取钱,钱不够但是都取出了钱
public class UnsafeBank {
public static void main(String[] args) {
Account account = new Account(10000000,"第一桶金");
Drawing you = new Drawing(account,50,"你");
Drawing girlFriends = new Drawing(account,1000000,"你的对象");
you.start();
girlFriends.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;
//现在手里有多少钱
int nowMoney;
public Drawing(Account account,int drawingMoney,String name){
super(name);
this.account = account;
this.drawingMoney = drawingMoney;
}
//synchronized默认锁的本身,this
package syn;
//不安全的买票
/*
线程不安全:
1.有负数
*/
public class UnsafeBuyTicket {
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 ticketNums = 10;
boolean flag = true;

浙公网安备 33010602011771号