读《JAVA并发实践》笔记---第三章(共享对象)

共享对象:
可见性:
当对一个变量的读写操作在不同线程实现的时候,不能保证读线程及时的读取其他线程写入的值。为了确保跨域线程写入内存的可见性,必须使用同步机制。
测试demo:

“`
public class NoVisibilityTest {

            public static void main(String[] args) {
                Value value = new Value();
                new Thread(value).start();

                while(true) {

                    if(value.isChange()) {
                        System.out.println("============value的值 : " + value.isChange() + "================");

                        try {
                            Thread.sleep(200);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        break;
                    }
        //          System.out.println("============value的值 : ================");
                }

            }

        }

        class Value implements Runnable {

            private boolean change = false;

            @Override
            public void run() {

                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                change = true;
                System.out.println("============value的值 : " + isChange() + "================");
            }

            public boolean isChange() {
                return change;
            }

            public void setChange(boolean change) {
                this.change = change;
            }

        }

“` 过期数据:
当读线程去获取变量时,它有可能获取一个过期。除非每一次访问变量的方法都是同步的。
最低安全性:
线程在没有同步的情况下读取变量,可能会获得一个过期值,但是事某个线程设定的一个真是数值。这叫最低安全性。
最低安全性适用于所有变量,除了没有声明为volatile的64位变量(double和long)。
锁和可见性:
当A和B用相同的锁监视同步代码块时,A在同步代码块之中或之前做的每件事,对B都是可见的。如果没有同步就没有这样的保证。
例图:
不同线程在相同锁中对共享数据查看
锁不仅仅是关于同步与互斥的,也是关于内存可见性的。为了保证所有线程都能看到共享的,可变变量的最新值,读和写线程都必须使用公共的锁进行同步。
Volatile变量:
弱形式的同步。当一个域被声明为volatile类型后,编译器和运行时会监视这个变量:它是共享的,而且对它的操作不会与其他内存操作一起被重排序。volatile变量不会缓存在寄存器或者缓存在其他处理器隐藏的地方。所以,读一个volatile变量,总是会返回某一线程所写入的最新值。
加锁可以保证可见性和原子性;volatile只能保证可见性。
正确使用volatile变量的方式包括:用于确保它们所引用的对象的状态的可见性,或者用于标识重要的生命周期事件(如初始化或关闭)的发生。
只有满足下面所有标准后,才能使用volatile变量:
1.写入变量时并不依赖变量当前值;或者确保只有单一线程修改变量的值。
2.变量不需要与其他状态变量共同参与不变约束。
3.访问变量时,没有其他原因需要加锁
线程封闭:
访问共享的,可变的数据要求同步。一个避免同步的方法就是不共享数据。(本地变量和ThreadLocal类)
不可变变量:
它的状态不能在创建后再被修改。
所有的域都是final类型。
它被正确创建(创建时没有发生this引用的溢出)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值