Sum*_*Tea 8 java concurrency static multithreading synchronized
在Java中实现单例模式时,我想出了这个问题.即使下面列出的示例不是我的真实代码,但与原始代码非常相似.
public class ConnectionFactory{
private static ConnectionFactory instance;
public static synchronized ConnectionFactory getInstance(){
if( instance == null ){
instance = new ConnectionFactory();
}
return instance;
}
private ConnectionFactory(){
// private constructor implementation
}
}
Run Code Online (Sandbox Code Playgroud)
因为我不太确定静态同步方法的行为,所以我从谷歌得到了一些建议 - 在同一个类中没有(或尽可能少)多个静态同步方法.我想在实现静态同步方法时,会使用属于Class对象的锁,这样多个静态同步方法可能会降低系统的性能.
我对吗?或者JVM使用其他机制来实现静态同步方法?如果我必须在类中实现多个静态同步方法,那么最佳实践是什么?
谢谢你们!
亲切的问候!
最好的方法(尽可能减少代码中的更改)是这样做的:
public class ConnectionFactory{
private static ConnectionFactory instance = new ConnectionFactory();
public static ConnectionFactory getInstance(){
return instance;
}
private ConnectionFactory(){
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,现在没有真正需要的getInstance方法,因此您可以将代码简化为:
public class ConnectionFactory{
public static final ConnectionFactory INSTANCE = new ConnectionFactory();
private ConnectionFactory(){
}
}
Run Code Online (Sandbox Code Playgroud)
关于同步的UPD:最好的方法是在外部类不可见的锁上进行同步,即:
public class ConnectionFactory{
private static final Object lock = new Object();
public static void doSmth() {
synchronized (lock) {
...
}
}
public static void doSmthElse() {
synchronized (lock) {
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
关于"为什么同步this是一个坏主意"(就像这个一样)有很多讨论,我认为在课堂上同步也是如此.
| 归档时间: |
|
| 查看次数: |
5916 次 |
| 最近记录: |