关于synchronized同步的使用
几乎各种牛人的文章都说到单例模式的双重检查有问题,类似下面的代码
并且说到有问题的原因是可能另外的线程检测到instance不为空,但是对象还没有初始化好。
但是我疑虑的是,如果这种写法有问题的话,那也就意味着在synchronized中只要new了对象都有可能有问题。
例如下面的写法
或者是这样的
那如果这些代码都有问题的话,那就无数的代码都有问题,只要是涉及到需要在多线程中创建对象的都可能有这种问题。
虽然各种大牛都说第一段代码里的这种问题,可以依靠volatile来解决。但是后面两种呢,这没法用volatile解决的啊。
感谢赐教
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
并且说到有问题的原因是可能另外的线程检测到instance不为空,但是对象还没有初始化好。
但是我疑虑的是,如果这种写法有问题的话,那也就意味着在synchronized中只要new了对象都有可能有问题。
例如下面的写法
public static synchronized Object newobj(){
return new Object();
}
或者是这样的
public static synchronized void addobj(ArrayList list){
list.add(new Object());
}
那如果这些代码都有问题的话,那就无数的代码都有问题,只要是涉及到需要在多线程中创建对象的都可能有这种问题。
虽然各种大牛都说第一段代码里的这种问题,可以依靠volatile来解决。但是后面两种呢,这没法用volatile解决的啊。
感谢赐教
...全文
相关推荐
java中synchronized(同步代码块和同步方法)详解及区别
**同步代码块 (Synchronized Block)** 同步代码块的语法结构如下: ```java synchronized (object) { // 需要同步的代码 } ``` 其中,`object
Java中synchronized关键字修饰方法同步的用法详解
总结,synchronized是Java中实现线程同步的关键手段,通过它可以有效控制并发访问,保证数据的一致性和完整性。正确理解和使用synchronized,对于编写高效、稳定的多线程程序至关重要。
java多线程编程之使用Synchronized块同步方法
对于静态方法的同步,由于静态方法不属于任何特定的对象,所以同步锁通常使用类的Class对象,例如:```javapublic class SyncBlock { public static synchronized
Java使用synchronized修饰方法来同步线程的实例演示
- **synchronized代码块**:使用`synchronized(obj){...}`结构,其中obj是需要锁定的对象,这将同步代码块内的代码。3.
java synchronized同步静态方法和同步非静态方法的异同
需要注意的是,过度使用`synchronized`可能会导致性能下降,因为它会阻塞线程,因此在设计并发程序时,应谨慎考虑同步的粒度和范围。


Java SE
