在java5.0提供了java.util.concurrent(简称juc)包,在此包中增加了在并发编程中很常用的实用工具类,用语定义类似于线程的自定义子系统,包括线程池、异步IO和轻量级任务框架,提供可调的、灵活的线程池,还提供了设计用于多线程上下文中的Collection实现等.
问题引出:
public class VolatileTest { public static void main(String[] args) { myThread td = new myThread(); new Thread(td).start(); while(true) { if(td.isFlag()) { System.out.println("******************"); break; } } } } class myThread implements Runnable{ private boolean flag = false; @Override public void run() { try { Thread.sleep(200); } catch (Exception e) { } flag = true; System.out.println("flag="+isFlag()); } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } }同步锁:
while(true) { synchronized (td) { //同步锁 if(td.isFlag()) { System.out.println("******************"); break; } } }volatile关键字:当多个线程操作共享数据时,可以保证内存中的数据是可见的,相对于synchronized是一种较为轻量级的同步策略。因此也可以使用volatile来解决共享数据的问题:
//不使用数据副本,直接在主存中操作 private volatile boolean flag = false;注意: 1.volatile不具备"互斥性" 2.volatile不能保证变量的"原子性"