Java基础之关于几种单例实现的思考

来源:互联网 发布:js设置input失去焦点 编辑:程序博客网 时间:2024/06/04 18:02

方案1:利用CAS原子性实现单例

这里写图片描述
  该实现方案存在问题:假设线程1获得锁将0置为1,还未创建对象但是CPU时间耗尽,此时线程2无法获取锁直接返回null。根本原因是:原子变量只能保证CAS操作是原子性的,但是后面的代码块无法保证。

方案2:使用双重锁检查实现单例

这里写图片描述
  synchronized特点是每次只允许单个线程进入,其它线程阻塞直到占有锁的线程执行完语句块中的语句,这样做的好处是阻塞线程会等待占有锁的线程创建完对象之后才会往下执行。

方案3:利用putIfAbsent原子性实现单例

这里写图片描述
  该方案存在问题:Singleton对象可能被创建多次,不适用于高并发且创建对象耗时或耗资源的场景。

原创粉丝点击