Volatile关键字也是多线程编程中经常会用到的关键字.下面详细说说volatile.
Volatile只能修饰变量,既可以是静态变量也可以是实例变量.
volatile保证每次都从主存强制读取其他线程修改后的最新数据.
当读一个volatile变量的时候,会把当前线程的本地内存设为无效,所以要去主存读取变量数据!
据我理解,在售票系统中会用到volatile关键字,为什么呢?因为像售票系统这样的应用,对于票池中的数量会
严格控制:
票池:
package basic.concurrent;
public class TicketPool {
private static volatile long tickets = 10L;
private static Object ticketLock = new Object();
public void sole(){
if(tickets == 0L){
System.out.println("票已经卖完了!");
return;
}
synchronized(ticketLock){
tickets--;
System.out.println(Thread.currentThread().getName()+"@@剩余:"+tickets+"票");
}
}
}
售票机器:
package basic.concurrent;
public class SoleDivice implements Runnable{
private TicketPool pool;
public SoleDivice(TicketPool pool){
this.pool = pool;
}
@Override
public void run() {
pool.sole();
}
}
测试:
package basic.concurrent;
public class PoolTest {
public static void main(String[] args) {
TicketPool pool = new TicketPool();
Runnable r = new SoleDivice(pool);
for(int i=0;i<15;i++){
new Thread(r).start();
}
}
}
结果:
Thread-0@@剩余:9票
Thread-7@@剩余:8票
Thread-4@@剩余:7票
Thread-1@@剩余:6票
Thread-2@@剩余:5票
Thread-5@@剩余:4票
Thread-8@@剩余:3票
Thread-10@@剩余:2票
Thread-11@@剩余:1票
Thread-3@@剩余:0票
票已经卖完了!
票已经卖完了!
票已经卖完了!
票已经卖完了!
票已经卖完了!