java:juc一

一: 内存可见性(volatile)

      内存可见性问题: 当多个线程操作共享数据时,彼此不可见。

      volatile关键字,当多个线程进行操作共享数据时,可以保证内存中的数据可见。 相较于synchronized, volatile不具有互斥性,并且不能保证原子性。

/**
*  volatile关键字,当多个线程进行操作共享数据时,可以保证内存中的数据可见。
* */
public class TestVolatile {
    public static void main(String[] args) {
        ThreadDemo td = new ThreadDemo();
        new Thread(td).start();

//        try {
//            Thread.sleep(4000);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }

        while(true){
            // 加锁也能解决可见性,但是效率很低
            //synchronized (td){
                if(td.isFlag()){
                    System.out.println("------");
                    break;
                }
            //}
        }
    }
}

class ThreadDemo implements Runnable{
    // 没有使用volatile关键字
    private boolean flag = false;

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        flag = true;
        System.out.println("flag="+flag);
    }
}

 二: cas算法

   cas算法是硬件对于并发操作共享数据的支持。 cas算法包含了三个操作: 1.内存值V   2. 预估值A   3. 更新值B。    当且仅当V == A时, V = B。

猜你喜欢

转载自blog.csdn.net/m0_37564426/article/details/113341576