面试题:线程同步有几种方法(百度面试题)
面试题:线程安全解释一下(大疆面试题)
为什么要线程同步?
当使用多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常。
举个例子,如果一个银行账户同时被两个线程操作,一个取100块,一个存钱100块。假设账户原本有0块,如果取钱线程和存钱线程同时发生,会出现什么结果呢?取钱不成功,账户余额是100.取钱成功了,账户余额是0.那到底是哪个呢?很难说清楚。因此多线程同步就是要解决这个问题。
演示一下上述不同步的银行账户的例子:
银行类:
public class Bank {
private int count =0;//账户余额
public void addMoney(int money){ //存钱
count +=money;
System.out.println(System.currentTimeMillis()+"存进:"+money);
}
public void subMoney( int money ){ //取钱
if( count - money < 0){
System.out.println("余额不足"); //如果钱不够则输出余额不足
return;
}
count -= money; //否则取出钱
System.out.println(+System.currentTimeMillis()+"取出:"+money);
}
public void lookMoney() { //查询
System.out.println("账户余额:" + count);
}
}
两个账户取钱:
public class SyncThreadTest {
public static void main(String args[]){
final Bank bank=new Bank(); //创建银行类
Thread tadd=new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
bank.addMoney(100); //取出钱
bank.lookMoney(); //查看钱
System.out.println("\n");
}
}
});
Thread tsub = new Thread(new Runnable() {
@Override
public void run() {
<