2、关于多线程并发环境下,数据的安全问题
* 以后的开发中,项目运行在服务器当中,而服务器已经将线程的定义,线程对象的创建,线程的启动
* 等实现了,我们不需要编写,但是,编写的程序需要放到一个多线程的环境下运行,
* 需要关注的是这些数据在多线程并发的环境下是否是安全的,这是最重要的。
*
* 1、什么情况下回出现线程安全问题?
* 1、多线程并发
* 2、有共享数据
* 3、共享数据有修改行为
* 2、怎么解决这个问题?
*
* 线程排队执行(不能并发),用排队执行解决线程安全问题,这种机制被称为:线程同步机制
* 线程同步就是线程排队,排队就会牺牲一部分效率,但是数据安全第一位
*
* 3、说到线程同步机制,有连个术语:
* 异步编程模型:
* 线程t1和线程t2,各自执行各自,谁也不管谁,其实就是对线程并发(效率较高)
* 同步编程模型:
* 线程t1和线程t2,在线程t1执行的时候,必须等等待t2线程执行结束,或者说在t2线程执行的
* 时候,必须等待t1线程执行结束,两个线程之间发生了等待关系,这就是同步编程模型(效率较低,排队执行)
*
package AccountThread;
public class Test {
public static void main(String[] args) {
Account aa = new Account("asdff",10000);
Thread bb = new AccountThread(aa);
Thread cc = new AccountThread(aa);
bb.setName("线程一");
cc.setName("线程二");
bb.start();
cc.start();
}
}
package AccountThread;
public class AccountThread extends Thread{
Account account;
public AccountThread(Account account) {
this.account = account;
}
@Override
public void run() {
account.withdraw(5000);
}
}
package AccountThread;
public class Account {
private String username;
private double balance;
public Account() {
}
public Account(String username, double balance) {
this.username = username;
this.balance = balance;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public void withdraw(double money){
double before = this.getBalance();
double after = before - money;
this.setBalance(after);
System.out.println(Thread.currentThread().getName() +money+ "取款成功," + "余额:" + this.getBalance());
}
}