两个线程对一个变量进行操作,但是没有上锁,即没有进行同步操作,就像买车票的时候多个窗口一起卖,但是车票数没有减去。车票被重复卖出。就是不安全。还有,被多个线程操作的变量改为静态量加static,才安全
创新互联专注于企业成都全网营销、网站重做改版、五寨网站定制设计、自适应品牌网站建设、H5场景定制、成都商城网站开发、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为五寨等各大城市提供网站开发制作服务。
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
假如一个变量在两个线程中都同时使用,如果一个线程正在操作这个变量的时候突然这个线程进入等待状态,被另一个线程抢了,另一个线程也在操作这个变量,就会发生一些不想出现的结果,所以有些线程要确保安全需要加上锁,同步块什么的
//银行卡类
public class BanCard {
private Double money = 5000d;
public synchronized void drawMoney(double howMoney,String threadName){
try {
System.out.println(threadName+"进入取钱操作!");
Thread.sleep(2000);//为了提前是一次只有一个线程进入此方法,进行了睡眠2秒
if(howMoneymoney){
System.out.println(threadName+"余额不足!");
return;
}
this.money-=howMoney;
System.out.println(threadName+"-原始余额:"+this.money+",取钱"+howMoney+"后,还剩余额"+this.money);
System.out.println(threadName+"结束取钱操作!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//线程类
public class ThreadDemo implements Runnable {
private BanCard banCard = new BanCard();
private double howMoney=0d;
public void run() {
banCard.drawMoney(this.howMoney,Thread.currentThread().getName());
}
public double getHowMoney() {
return howMoney;
}
public void setHowMoney(double howMoney) {
this.howMoney = howMoney;
}
}
//main所在类
public class Test1 {
public static void main(String[] args) {
ThreadDemo threadDemo = new ThreadDemo();
threadDemo.setHowMoney(3000d);//取款3000
Thread thread1 = new Thread(threadDemo);
thread1.start();
threadDemo.setHowMoney(4000d);//取款4000
Thread thread2 = new Thread(threadDemo);
thread2.start();
}
}