- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
比尔普格解决方案
public class ThreadSafeSerializedSafeSingleton implements Serializable {
private ThreadSafeSerializedSafeSingleton() {
}
private static class SingletonHelper {
private static final ThreadSafeSerializedSafeSingleton instance = new ThreadSafeSerializedSafeSingleton();
}
public static ThreadSafeSerializedSafeSingleton getInstance() {
return SingletonHelper.instance;
}
}
VS
延迟初始化线程安全单例
public class ThreadSafeSingleton {
private static ThreadSafeSingleton instance;
private ThreadSafeSingleton() {
}
public static synchronized ThreadSafeSingleton getInstance() {
if (instance == null) {
instance = new ThreadSafeSingleton();
}
return instance;
}
}
最佳答案
Bill Pugh 的解决方案相对于所提出的延迟初始化单例实现的优势与性能相关。考虑下一个场景。
实例已初始化并且两个线程同时请求该实例。
无论如何,这可以通过双重检查锁定实现单例来(部分)缓解。请参阅下面的示例。
双重检查锁定单例:
public final class DoubleCheckedLockingSingleton {
private static volatile DoubleCheckedLockingSingleton instance;
private DoubleCheckedLockingSingleton(){
if(instance!=null)
throw new RuntimeException();
}
public static final DoubleCheckedLockingSingleton getInstance(){
if(instance==null){
synchronized(DoubleCheckedLockingSingleton.class) {
if(instance==null)
instance = new DoubleCheckedLockingSingleton();
}
}
return instance;
}
}
在这种情况下,性能差异并不显着。双重检查锁定实现和持有者模式实现之间的主要区别在于其工作原理。
instance == null
,因为两个线程可能(虽然可能性很小,但最好的 bug)在第一个 if 和同步块(synchronized block)之间交换。您还必须声明变量 volatile ,以便利用 JMM 对 volatile 的“发生在”保证(因此您可以确定 instance==null
检查不会返回 false,直到实例>完全初始化)。 就我个人而言,我更喜欢持有者模式而不是双重检查锁定,因为它工作的原因似乎更容易理解(至少对我来说)。
最后一点,如果您的需求允许(即,如果您使用 DI 框架,例如 Spring),实现单例的最佳方法是让 Spring 为您提供单例(通过使用 @Component
具有默认的单例范围)。
关于java - Bill Pugh 解决方案相对于延迟初始化单例解决方案有什么优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52381096/
我收到一封来自 Google 的邮件,其中提到“我们将终止对应用内结算第 2 版 API 的支持。在此日期之后,用户将无法再使用您的应用程序进行应用程序内购买,直到您将您的应用程序升级为使用第 3 版
假设我有类似 GATES, Bill.jpg 的文件我想将它们全部重命名为 Bill Gates.jpg .我能捕捉到这两个词 rename 's/^(.*?), (.*?)\./$2 $1\./g'
我的 google play 计费有问题。我有一个 android 应用程序,其中包含应用程序内购买。我维护 SharedPreference 以购买应用程序状态。如果谷歌将购买状态设为成功,那么我会
我正在尝试关注 In-App Billing tutorial on the Android Developer site .我准备提出应用内结算请求。我应该将代码添加到我的项目中: ArrayLis
我是 android 的新手,第一次尝试实现应用内结算。 我正在使用 google play 应用内库。 https://developer.android.com/google/play/billi
在我的应用中设置应用内购买时,我发现有两个与计费相关的权限: 这两种权限有什么区别?似乎大多数在线人都说使用第一个进行应用内购买,但第二个需要什么? 最佳答案 作为引用,如果您已迁移到 Billi
我遇到了应用内结算库(使用 BillingClient )和应用内结算 API(使用 IInAppBillingService )都用于管理订阅,我的问题是在什么情况下必须使用哪个。 我正在使用 In
我正在尝试使用应用内结算: mIabHelper = new IabHelper(this, BILLING_KEY); mIabHelper.startSetup(new IabHe
我已经开设了一个新的谷歌云帐户,我即将在其上设置一个虚拟机。在此之前,我想创建一个存储桶,我将从一个存储桶复制到另一个存储桶。 我能够创建一个存储桶,在复制时我面临如下问题: AccessDenied
我知道“Google Play Billing with AIDL”已弃用,但我正在使用的应用程序非常复杂,我不想更改应用程序的核心部分。 在游戏控制台上,我收到以下消息:- “我们检测到您的应用使用
我已经检查了我的项目,它有一个活跃的 billing account 我正在使用 Node.js var gcloud = require('gcloud'); var gcs = gcloud
我正在开发一个 Firebase Cloud Function,它从存储在 Firebase 存储中的文件中收集元数据 我的代码大致是这样的: const { Storage } = require(
将 billingclient 升级到 2.1.0 时: implementation 'com.android.billingclient:billing:2.1.0'//from 2.0.1 我的
我想知道为什么prometheus不适合计费系统。 普罗米修斯概述页面说 If you need 100% accuracy, such as for per-request billing, Pro
我写了一个基于订阅的网络应用程序,我想(通过信用卡)按月收费。有 3 种不同的计划,一旦他们注册,就应该每月自动向他们收取该金额,直到他们取消为止。有没有一种简单的方法来设置它(可能是某种在线服务?)
我正在尝试使用 'com.android.billingclient:billing:2.0.3' 库实现应用内购买。 该应用在内部测试轨道中发布,并且有一个托管产品和一个测试人员(我的另一个帐户),
BillingClient queryPurchases 方法的谷歌文档说明如下: “出于安全考虑,建议通过调用以下 API 在您的后端(如果有的话)进行购买验证:https://developers
我正在研究使用 google play 在应用计费中实现自动续订订阅的方法。我读了 https://developer.android.com/google/play/billing/billing_
我查看了文档 ( https://www.braintreepayments.com/docs/ruby/subscriptions/overview ),但看不到是否可以更改事件订阅的下一个计费日期
我想为我们使用 Braintree 的计费系统添加一些单元测试,但我不知道如何将订阅期从 1 个月(目前在 Braintree 中的最小值)更改为 1 天。我不能等待 1 个月来执行我的测试。有什么解
我是一名优秀的程序员,十分优秀!