小编aar*_*chu的帖子

为什么 UTF-8 BOM 字节 efbbbf 可以替换为 \ufeff?

字节顺序标记(BOM)UTF-8EF BB BF,如在说明中的Unicode 9的部分23.8规范(搜索“签名”)。

Java中的许多解决方案都只是一个简单的一行代码:

 replace("\uFEFF", "")
Run Code Online (Sandbox Code Playgroud)

我不明白这为什么有效。

这是我的测试代码。我在调用后检查二进制文件String#replace,我发现 EF BB BF 已被删除。查看此代码在 IdeOne.com 上实时运行

太神奇了。为什么这样做?

@Test
public void shit() throws Exception{
    byte[] b = new byte[]{-17,-69,-65, 97,97,97};//EF BB BF 61 61 61
    char[] c = new char[10];
    new InputStreamReader(new ByteArrayInputStream(b),"UTF-8").read(c);
    byte[] bytes = new StringBuilder().append(c).toString().replace("\uFEFF", "").getBytes();//
    for(byte bt: bytes){//61 61 61, we can see EF BB BF is indeed removed
        System.out.println(bt);
    }
}
Run Code Online (Sandbox Code Playgroud)

java byte-order-mark

6
推荐指数
2
解决办法
4121
查看次数

使用双重检查锁定实现单例时,我们是否需要 volatile

假设我们使用双重检查锁来实现单例模式:

    private static Singleton instance;

    private static Object lock = new Object();

    public static Singleton getInstance() {
        if(instance == null) {
            synchronized (lock) {
                if(instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

Run Code Online (Sandbox Code Playgroud)

我们是否需要将变量“instance”设置为“volatile”?我听到有人说我们需要它来禁用重新排序:

创建对象时,可能会发生重新排序:

address=alloc
instance=someAddress
init(someAddress)
Run Code Online (Sandbox Code Playgroud)

他们说如果最后两个步骤被重新排序,我们需要一个 volatile 实例来禁用重新排序,否则其他线程可能会得到一个没有完全初始化的对象。

然而,既然我们在一个同步代码块中,我们真的需要 volatile 吗?或者一般来说,我可以说同步块可以保证共享变量对其他线程是透明的,即使它不是 volatile 变量也不会重新排序吗?

java singleton volatile synchronized

3
推荐指数
1
解决办法
229
查看次数