synchronized
package com.seven.unsafe;
//银行取钱不安全
//synchronized:同步代码块,也可以同步方法。保持需要修改的数据安全
public class UnsafeBank {
public static void main(String[] args) {
Account account = new Account(100, "张三");
Bank bank1 = new Bank(account, 50);
Bank bank2 = new Bank(account, 100);
Thread thread1 = new Thread(bank1, "你");
Thread thread2 = new Thread(bank2, "女朋友");
// thread1.setPriority(3);
thread1.start();
// thread2.setPriority(3);
thread2.start();
}
}
//银行账户
class Account {
private int money;//钱
private String name;//用户名
public Account(int money, String name) {
this.money = money;
this.name = name;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//银行取钱
class Bank implements Runnable{
private Account account;
private int drawingMoney;
private int myMoney;
public Bank(Account account, int drawingMoney) {
this.account = account;
this.drawingMoney = drawingMoney;
}
@Override
public void run() {
synchronized (account){
if (account.getMoney()-drawingMoney<0)//账户的钱-要取的钱小于0,返回钱不够
{
System.out.println(Thread.currentThread().getName()+"钱不够了,不能取出");
return;
}
//线程休眠:放大事件发生性
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
//取钱
account.setMoney(account.getMoney()-drawingMoney);//账户余额=账户余额-要取的钱
myMoney = myMoney+drawingMoney;//我的钱=我的钱+要取的钱
System.out.println(account.getName()+"账户余额"+account.getMoney());
System.out.println(Thread.currentThread().getName()+"手里的钱"+myMoney);
}
}
}
reentrantLock
package com.seven.unsafe;
import java.util.concurrent.locks.ReentrantLock;
public class TestReentrantLock {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket).start();
new Thread(ticket).start();
new Thread(ticket).start();
new Thread(ticket).start();
}
}
class Ticket implements Runnable{
int ticketNums = 10;
private final ReentrantLock lock = new ReentrantLock();//new一个ReentrantLock
@Override
public void run() {
while(true){
try {
lock.lock();//加锁
if (ticketNums<=0) break;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"拿到了票"+ticketNums--);
}finally {
lock.unlock();//解锁
}
}
}
}
扩展CopyonWriteArrayList
package com.seven.unsafe;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
//CopyOnWriteArrayList内部提供了线程安全
public class TestCopyOnWriteArrayList {
public static void main(String[] args) throws InterruptedException {
// List list = new ArrayList();
CopyOnWriteArrayList copyonWriteArrayList = new CopyOnWriteArrayList();
new Thread(()->{
for (int i = 0; i < 10000; i++) {
// list.add(Thread.currentThread().getName());
copyOnWriteArrayList.add(Thread.currentThread().getName());
}
}).start();
Thread.sleep(3000);
System.out.println(copyOnWriteArrayList.size());
// System.out.println(list.size());
}
}