一、线程安全
如果多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程的结果一样的,而且其他的变量的值和预期的是一样的,就是线程安全的。
public class Ticker implements Runnable{
private int ticket=100;
public void run(){
//获取当前程序执行所属的线程 的名称
String threadName=Thread.currentThread().getName();
while(true){
if(ticket>0){
System.out.println(threadName+"正在销售第"+ticket);
//有票 可以卖
//使用sleep模拟一下出票时间
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
ticket--;
}else{
break;
}
}
}
}
为了保证每个线程正常执行原子操作,有三种同步的方法
1.同步代码块
synchronized关键字可以用于方法中的某个区块中,表示只对这个区块的资源实施互斥访问
synchronized (同步锁){
需要同步的操作的代码
}
同步锁:
对象的同步锁只是一个概念,可以想象对方为在对象上标记了一个锁。
1.锁对象:可以是任意类型
2.多个线程对象,要使用同一把锁。