Java模因拒绝死亡
有许多Java模因让我很烦,部分是因为它们总是一个坏主意,但主要是因为人们在找到更好的替代方案后的几年里仍在继续使用它们。
使用StringBuffer代替StringBuilder
从2004年开始,用于StringBuffer的Javadoc
从JDK 5版本开始,该类已经添加了一个等效类,该类旨在供单线程StringBuilder使用。 通常应优先使用StringBuilder类,因为它支持所有相同的操作,但它却更快,因为它不执行同步,因此它优先于此类使用。
StringBuilder不仅是一个更好的选择,而且本来可以使用同步StringBuffer的情况非常罕见,这与以往不同,这是一个好主意。
说你有代码
// run in two threads
sb.append(key).append("=").append(value).append(", ");
每个追加都是线程安全的,但是可以随时释放该锁,这意味着您可以
key1=value1, key2=value2,
key1=key2value1=, value2,
key1key2==value1value2, ,
更糟糕的是,为了提高效率,JIT和JVM将试图在两次调用之间保持锁定。 这意味着您可以拥有可以通过所有测试并可以在生产环境中使用多年的代码,但是很少中断,这可能是由于升级JVM所致。
使用DataInputStream读取文本
另一个常见的模因是在读取以下模板中的文本时使用DataInputStream(三个行,两个阅读器在同一行),我怀疑有一个原始代码被复制了。
FileInputStream fstream = new FileInputStream("filename.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
这是不好的,原因有三个
- 由于BufferedReader的缓冲性质,您可能会倾向于使用in来读取无法使用的二进制文件。 (我已经看到了这个尝试)
- 同样,您可能会相信DataInputStream在不这样做的情况下会在此处做一些有用的事情
- 有一种更短的方法是正确的。
BufferedReader br = new BufferedReader(new FileReader("filename.txt"));
// or with Java 7.
try (BufferedReader br = new BufferedReader(new FileReader("filename.txt")) {// use br
}
使用双重检查锁定创建单例
首次使用Double Checked锁定时,这是一个坏主意,因为JVM不安全地支持此操作。
// Singleton with double-checked locking:
public class Singleton {private volatile static Singleton instance;private Singleton() { }public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
问题在于,直到Java 5.0为止,这通常是可行的,但在内存模型中无法保证。 有一个更简单的选项是安全的,不需要显式锁定。
// suggested by Bill Pugh
public class Singleton {// Private constructor prevents instantiation from other classesprivate Singleton() { }/*** SingletonHolder is loaded on the first execution of Singleton.getInstance()* or the first access to SingletonHolder.INSTANCE, not before.*/private static class SingletonHolder {public static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}
这仍然很冗长,但是可以正常工作,不需要显式锁定,因此可以更快。
在Java 5.0中,当他们修复内存模型以安全地处理双重锁定时,他们还引入了枚举,从而为您提供了更为简单的解决方案。
约书亚·布洛赫(Joshua Bloch)在他的第二本书《有效的Java》中声称“单元素枚举类型是实现单例的最佳方法”
使用枚举,代码看起来像这样。
public enum Singleton {INSTANCE;
}
这是延迟加载的,线程安全的,没有显式的锁并且简单得多。
参考: Java模因在Vanilla Java博客上拒绝死于我们的JCG合作伙伴 Peter Lawrey。
翻译自: https://www.javacodegeeks.com/2012/08/java-memes-which-refuse-to-die.html
Java模因拒绝死亡相关推荐
- java线程死亡_Java模因拒绝死亡
java线程死亡 也有标题: 我的宠物讨厌Java编码. 有许多Java模因让我很烦,部分是因为它们总是一个坏主意,但主要是因为人们在找到更好的替代方案后的几年里仍在不断地选择它们. 使用String ...
- 判断Java 对象实例是否死亡
垃圾收集器与内存分配策略参考目录: 1.判断Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9中的GC 调优 5.内存分配与回收策略 在进入主题之前,我们要先 ...
- Perl 安装Inline 和 Inline Java模组(windows)
前言 在 Perl 安装及模组安装方法[windows] 这一篇中, 介绍了安装模组的几种方法. 使用PPM来安装应该是最简单的.因为PPM 会自动帮我们找到依赖项, 并进行安装. 但是实际状况却并非 ...
- linux关闭的时候出现异常: java.net.ConnectException: 拒绝连接 (Connection refused)
linux关闭的时候出现异常: java.net.ConnectException: 拒绝连接 (Connection refused) 参考文章: (1)linux关闭的时候出现异常: java.n ...
- hadoop运行程序时报错java.net.ConnectException: java.net.ConnectException: 拒绝连接;
hadoop配置完之后 格式化正常.启动集群正常 但是提交任务的时候 java.net.ConnectException: Call From hadoop01/192.168.245.139 to ...
- Java多线程-任务拒绝策略
Java多线程-任务拒绝策略 简介 Rejected tasks New tasks submitted in method execute(Runnable) will be rejected wh ...
- 本地mysql拒绝jdbc连接失败_jdbc连接MySQL数据库的诡异异常 java.net.ConnectException: 拒绝连接...
今天遇到一个很诡异的异常,查了很多资料都没有解决. 用JDBC连接数据库的时候出现以下异常 @Test public void test() { try { Class.forName("c ...
- Call From xx/x.x.x.x .hdp1:9000:java.net.ConnectException:拒绝连接For m...see:http://wiki.apac..Refused
问题: 在hdfs上创建文件夹: mkdir: Call From hdp1/192.x.x.143 to hdp1:9000 fail...tion exception: java.net.Conn ...
- hadoop操作出现:9000 failed on connection exception: java.net.ConnectException:拒绝访问(已解决)
准备查看haddop上的文件,输入: hadoop fs -ls / 出现了: ls: Call From yx/127.0.1.1 to 0.0.0.0:9000 failed on connect ...
最新文章
- Python01——初识python
- UNIX中的Poll函数
- unity2D限制位置的背景移动补偿效果
- 网络编程(part12)--HTTP传输
- 打造更好用的 EF 自动审计
- xenserver 安装新硬盘_给Xenserver添加新硬盘
- SpringBoot—JPA和JDBC常用配置说明
- Visual Studio 2017 正式版各版本比较:企业版最强大
- 一只刚学竞价两周的菜鸟
- 腾讯云服务器被黑客攻击的解决办法
- 数字图像处理笔记(九)基本的形态学算法
- [5分钟学会Katana Katana中文教程]—摘要
- linux装回win10系统无法开机,ghost win10系统安装后无法启动怎么办
- Web性能测试基本性能指标及案例分析
- java date clone_Java Date clone()方法与示例
- keil中更改stm32芯片类型需要修改的配置
- 懂得这些电脑使用技巧可以让你的电脑更好用更高效!
- python for finance pdf_python金融大数据分析 pdf
- 加油站爆出注水汽油 豪车熄火
- 发射接收模块与示波器
热门文章
- hash地址_一致性Hash在负载均衡中的应用
- es嵌套聚合dsl(求均值,求和)
- javafx 打开新窗口_新的JMetro JavaFX 11兼容版本
- jdk8 string::_JDK 12的String :: transform方法的简要但复杂的历史
- java lambda循环_使用Java 8 Lambda简化嵌套循环
- tcga癌症亚型获取_亚型多态性应用于元组的危险
- hibernate与jpa_将JPA Hibernate与OptaPlanner集成
- mongodb实验报告_Dropwizard,MongoDB和Gradle实验
- php cdi_CDI和EJB:在事务成功时发送异步邮件
- java用i/o查看文件_Java文件I / O基础