首先,什么是线程安全问题呢?
线程安全问题指的是,多个线程同时操作同一个共享资源的时候,可能会出现业务安全问题。
线程同步方案
为了解决线程安全问题,我们可以使用线程同步思想。同步最常见的方案就是加锁,意思是每次只允许一个线程加锁,加锁后才能进入访问,访问完毕后自动释放锁,然后其他线程才能再加锁进来。
第一种(同步代码块)
public void brawMoney(double money){
String name = Thread.currentThread().getName();
synchronized (this) {
if (this.money>=money){
System.out.println(name+"来取了"+money+"元");
this.money-=money;
System.out.println(name+"取完钱后,账户还剩余"+this.money+"元");
}else {
System.out.println(name+"来取钱,账户里的钱不够");
}
}
}
第二种(同步方法,synchronized关键字)
public synchronized void brawMoney(double money){
String name = Thread.currentThread().getName();
if (this.money>=money){
System.out.println(name+"来取了"+money+"元");
this.money-=money;
System.out.println(name+"取完钱后,账户还剩余"+this.money+"元");
}else {
System.out.println(name+"来取钱,账户里的钱不够");
}
}
第三种(lock锁)
final Lock lock=new ReentrantLock();
public void brawMoney(double money){
String name = Thread.currentThread().getName();
lock.lock();
try {
if (this.money>=money){
System.out.println(name+"来取了"+money+"元");
this.money-=money;
System.out.println(name+"取完钱后,账户还剩余"+this.money+"元");
}else {
System.out.println(name+"来取钱,账户里的钱不够");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}