`
砺雪凝霜
  • 浏览: 157046 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

给静态方法加同步锁

阅读更多

                                               给静态方法加同步锁

     我们知道利用synchronized关键字可以解决线程安全的问题,synchronized可以加在代码块中,也可以加在同步方法中。synchronized加在方法中的时候等价于:

synchronized(this){

     对共享资源进行操作的代码块

}

问题:静态方法的锁加在什么对象上呢?

        加锁的时候要传一个Object对象,但是static修饰的方法在加载的时候是没有new出对象的,实际上这个锁是加在当前类的字节码对象上。

 

单利设计模式有2种:

1.饿汉式

public class Singal{ 
     private static final Singal singal = new Singal();
       private Singal(){};
      private static Singal getInstance()
      { 
             return singal; 
    }  
  }

 2.懒汉式

      有人觉得上面那种的效率不是很高,于是就出现了下面一种,简称懒汉式

  优点是可以实现延迟加载,效率高。

 

public class Singal {
        public static Singal singal = null;
	private Singal() {};
	private static Singal getInstance() {
	   if (singal == null) {
		singal = new Singal();
	    }
	return singal;
     }
}

 分析:红色标记的这段代码会出现线程安全问题

       当if(singal==null)这段代码执行完后,另外一个线程也抢到了cpu的执行权
并执行完,生成了一个Singal对象。等原线程回过头也会生成一个Singal对象。

这样就生成了2个singal对象了,线程安全问题也就这样产生了。 

 

注:对上面代码进行优化后,就不会出现线程安全问题,但是锁是加在当前类的字节码

        对象上的。

 public class Singal {
     // 懒汉式有延迟加载的功能,但是会出现线程不安全的问题。
public static Singal singal = null;
private Singal() {};
private static Singal getInstance() {
    synchronized (Singal.class) {
            if (singal == null) {
                      singal = new Singal();
           }
      }
    return singal;
  }
}

          

分享到:
评论

相关推荐

    静态方法同步 与 非静态方法同步

    这意味着所有实例共享同一个锁,不论创建了多少个对象,所有线程在调用静态同步方法时都会争夺这个单一的锁。这样的同步机制适用于需要全局保护的资源或状态。 例如,在`SynchronizedTest.java`中可能会有以下静态...

    java synchronized同步静态方法和同步非静态方法的异同

    同步静态方法的锁是类的Class对象,这意味着所有实例共享这个锁,无论多少个实例,同步静态方法在同一时刻只能有一个在执行: ```java public class Test { public static synchronized void method1() { // ... ...

    python线程中同步锁详解

    Python线程中的同步锁是确保多线程程序正确运行的关键工具。它们主要用于解决在多线程环境下访问共享资源时可能出现的竞态条件和死锁问题。以下是对标题和描述中涉及知识点的详细解释: 1. **Lock(互斥锁)** - *...

    基于synchronized修饰静态和非静态方法

    情况3:一个对象在两个线程中分别调用一个静态同步方法和一个非静态同步方法结果:不会产生互斥。解释:因为虽然是一个对象调用,但是两个方法的锁类型不同,调用的静态方法实际上是类对象在调用,即这两个方法产生...

    Android多线程之同步锁的使用

    Android多线程之同步锁的使用 Android多线程之同步锁的使用是Android应用程序开发中非常重要的一部分。多线程编程可以提高应用程序的性能和响应速度,但是它也带来了线程安全的问题。同步锁是解决线程安全问题的...

    Java并发学习笔记(二)——Synchronized关键字与ReetrantLock同步锁

    【Java并发学习笔记(二)——Synchronized关键字与ReentrantLock同步锁】 在Java多线程编程中,确保线程安全是非常重要的。Synchronized关键字和ReentrantLock是两种常见的同步机制,它们都用于保证线程的原子性、...

    3.线程间同步和通信之互斥锁(静态)

    在本教程中,我们将探讨“互斥锁”这一机制,它是实现线程同步的一种常见方法。互斥锁在STM32微控制器上使用RT-thread实时操作系统时尤为重要。 首先,我们要理解什么是互斥锁。互斥锁,英文名为Mutex,是一种同步...

    Java多线程-同步机制解决线程安全问题方式一:同步代码块

    在这个例子中,静态方法的同步锁是类的`Class`对象,确保同一时间只有一个线程能调用这个方法。 2. 示例2 - 非静态方法加锁 ```java public synchronized void saleOneTicket() { // 锁对象是this,即当前对象 ...

    dotnet 谨慎在静态构造函数里使用锁.rar

    这是由.NET运行时自动处理的,因此开发者通常不需要在静态构造函数中添加额外的同步控制,如锁(`lock`关键字)。 接下来,我们讨论为何要在静态构造函数中谨慎使用锁。在多线程环境中,如果在静态构造函数中使用锁...

    易语言源码实现易语言类静态数据成员的方法.rar

    易语言提供了同步控制语句,如`同步锁`等,可以用来保证数据的安全访问。 在提供的压缩包“实现易语言类静态数据成员的方法”中,可能包含了示例代码、教程文档或演示程序,用于详细解释如何在实际编程中应用这些...

    利用静态变量对函数访问次数计数.zip

    值得注意的是,静态变量在多线程环境下需要额外的同步机制,因为多个线程可能同时访问和修改它,导致数据不一致。通常,可以使用互斥锁(mutex)来确保线程安全。例如: ```cpp #include std::mutex accessMutex;...

    赋值后的静态句柄和实例莫名其妙消失了???在线等

    - 在多线程环境下,使用同步块或锁来保护静态变量的访问。 - 如果涉及到内存管理,确认是否正确释放了内存并避免悬挂指针。 - 调试代码,查看静态变量在程序运行过程中的变化,找出异常之处。 - 检查框架或库的文档...

    线程同步的理解

    所有线程在调用此类的静态同步方法时,都需要获取到类的Class对象锁,因此,无论多少个对象实例,只要调用此类的静态同步方法,都会进行同步。这种锁机制在实现单例模式的懒汉式初始化时特别有用,确保了在多线程...

    NET多线程同步方法详解

    自由锁主要通过Interlocked类提供的静态方法来实现线程安全的整型数值操作,如Increment和Decrement。这些操作在多线程环境下是原子的,避免了并发时可能出现的数据不一致问题。此外,Interlocked类还提供了Exchange...

    java多线程编程之使用Synchronized块同步方法

    在非静态类方法的同步中,如果想要同步类的所有非静态方法,可以使用`this`作为同步锁,因为`this`代表当前对象实例。例如: ```java public class SyncBlock { public void method1() { synchronized (this) { ...

    synchronized枷锁实例

    例如,一个线程可以调用类的静态同步方法,同时另一个线程调用同一个类的实例同步方法,这两个操作是可以并发进行的,因为它们锁定的对象不同。 在实际开发中,正确地使用`synchronized`关键字可以有效地避免线程...

    java 多线程设计模式 进程详解

    静态方法(有关同步的细节) 总结 第五章 Java线程编程的例子 数据结构和容器 简单的同步例子 一个网络服务器类 AsyncInputStream类 使用TCPServer和AsynclnputStream 总结 第六章 Java线程调度 线程调度概述 ...

    java synchronized 学习

    * 若此对象对应的类中包含了多个 synchronized 修饰的方法或代码块,多个线程访问同一个对象的任意 synchronized 修饰的方法或代码块,只要有一个线程拥有了 synchronized 同步锁,其他线程不管想访问 synchronized ...

    FreeRTOS任务创建和删除实验(静态方法)

    5. **FreeRTOS API**:实验还将涵盖其他FreeRTOS API的使用,如任务控制(如挂起和恢复任务)、延时(`vTaskDelay()`)以及可能的同步机制(如互斥锁或信号量)。 6. **STM32集成**:STM32是基于ARM Cortex-M内核的...

    线程同步面试题深入解析

    同步方法分为静态同步方法和非静态同步方法。静态方法使用`static synchronized`修饰,锁住的是类的Class对象,而非静态方法锁住的是当前实例对象。这意味着,对于同一类的不同实例,静态同步方法之间是互斥的,而...

Global site tag (gtag.js) - Google Analytics