对象发布和初始化时的线程安全问题解决方案

如何理解逸出?

  • 方法返回一个private对象
  • 还未完成初始化,构造函数还没完全执行完毕,就把对象提供给外界 如 :
  • 在构造函数中未初始化完毕就this赋值
  • 隐式逸出 --- 注册监听事件
  • 构造函数中运行线程

我们来看方法返回一个private对象的这种情况:

 

public class UnsafeStates {
    private String[] states = new String( ) {
        "AK", "AL" ...
    };
    public String[] getStates() {
       return states;
    }
}

如果按照上述方式来发布states,就会出现问题。因为任何调用者都能修改这个数组的内容。在这个示例中,数组states已经逸出了它所在的作用越,因为这个本应是私有的变量已经被发布了,作用越以外的任何地方都可以修改其内容。因此它存在安全隐患。

我们来看在构造函数中未初始化完毕就this赋值的这种情况

 

public class ThisEscape {

    static Point point;

    public static void main(String[] args) throws InterruptedException {
        new PointMaker().start();
        Thread.sleep(10000);
        // Thread.sleep(105);
        if (point != null) {
            System.out.println(point);
        }
    }
}

class Point {

    private final int x, y;

    public Point(int x, int y) throws InterruptedException {
        this.x = x;
        ThisEscape.point = this;
        Thread.sleep(100);
        this.y = y;
    }

    @Override
    public String toString() {
        return x + "," + y;
    }
}


class PointMaker extends Thread {

    @Override
    public void run() {
        try {
            new Point(1, 1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

通过执行以上代码,我们会发现,不同时间段的请求,执行结果并非一致。在ThisEscape中给出了逸出的一个特殊示例,既this引用在构造函数中逸出。当从对象的构造函数中发布对象时,只是发布了一个尚未构造完成的对象。如果this引用在构造过程中逸出,那么这种对象就被认为是不正确构造。

从应用上,保持与AT模式一致的无侵入。
如果你的库支持mallopt()函数(用于控制malloc),尽量使用它。
key2是映射到5501这个slot上,存储在NodeB。
建议将该参数设置大于等于3,即可将undolog设置到单独的undo表空间中。
Java提供了两种机制来防止代码块收到干扰:synchronized关键字和ReentrantLock类(java5.0)(java.util.concurrent框架)①锁对象java.util.concurrent.locks.Lock5.0voidlock()获取锁voidunlock()释放锁java.util.concurrent.locks.ReentrantLock5.0ReentrantLock(【boolean】)构建一个非公平(带参数为公平)的可重入锁。

中俄两国面对共同挑战,更要紧密科技创新方面的合作。

作者:https://www.cnblogs.com/gquprn/nhxuli/13908182.html
链接:http://www.autono1.com/
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值