`
砺雪凝霜
  • 浏览: 153013 次
  • 性别: 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;
  }
}

          

分享到:
评论

相关推荐

    python线程中同步锁详解

    主要为大家详细介绍了python线程中同步锁的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

    3.线程间同步和通信之互斥锁(动态),通过按键和LED的组合学习互斥锁的功能,理解互斥锁

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

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

    java中的锁.xmind

    3.同步器是面向锁的实现者,他简化了锁的实现方式,屏蔽了同步状态管理、线程排队、等待和唤醒等底层操作 4.同步器的设计是基于设计模式为:模板方法模式 AQS实现细节: 1.同步器依赖内部的同步队列-FIFO双向队列来...

    java Thread

    两个售票窗口同时出售50张票; 程序分析:1.票数要使用同一个静态值 2....售票要使用同步锁:即有一个站台卖这张票时,其他站台要等这张票卖完! 2.创建主方法调用类 里面有源码,导入myeclipse执行

    java线程同步(实例讲解,清晰易懂)

    线程的同步与锁,静态方法同步,线程安全类,用实例详细的介绍了线程同步的知识,易于理解!

    session简介.doc

    session简介.doc

    Linux系统编程之线程同步

    1. 静态初始化:如果互斥锁 mutex 是静态分配的(定义在全局,或加了static关键字修饰),可以直接使用宏进行初始化。e.g. pthead_mutex_t muetx = PTHREAD_MUTEX_INITIALIZER; 2. 动态初始化:局部变量应采用动态...

    实例解析Java中的synchronized关键字与线程安全问题

    synchronized代码块,被修饰的代码成为同步语句块,其作用的范围是调用这个代码块的对象,我们在用synchronized关键字的时候,能缩小代码段的范围就尽量缩小,能在代码段上加同步就不要再整个方法上加同步。...

    Java多线程与并发-原理

    文章目录synchronized线程安全主要诱因互斥锁特性获取对象锁同对象,异步同对象,同步代码块同对象,非静态同步方法同对象,同步代码块 对比 非静态同步方法不同对象,同步代码块 对比 非静态同步方法获取类锁和对象...

    java—多线程的通信、生产者与消费者模式

    一、重点知识 isDaemon 判断是否为守护线程。 run方法是不能用synchronized修饰,他是继承来的,不能改变其结构,...stringBuffer中的同步方法,都是非静态的,因为共用一个this锁就可以了,线程进去调用他的一个方法

    C#线程锁介绍源码

    1.几种同步方法的区别 lock和Monitor是.NET用一个特殊结构实现的,Monitor对象是完全托管的、完全可移植的,并且在操作系统资源要求方 面可能更为有效,同步速度较快,但不能跨进程同步。lock(Monitor.Enter和...

    项目中用到的jdbc连接 单例模式

    /** * JDBCConnection for Singleton * 双重检查加锁方法,由于JVM... * 同时,jvm的类加载机制保证了绝对不会出现同步问题,避免了双检查锁。 * 优点:延迟加载,而且不需要同步。 * @author Zephyr.Qiao * */

    day020-继承加强和设计模式代码和笔记.rar

    最简单的线程安全的方式:同步方法,效率低 更好的的线程安全的方式:双重校验锁 3. 枚举: public enum Singleton{ INSTANCE; } 5. 作用: 1. 全局配置...

    linux中各种锁机制的使用与区别详解

    前言: 相信需要了解这方面的知识的小伙伴,已经基本对进程间通信和线程间通信有了一定了解。...有两种方法创建互斥锁,静态方式和动态方式。POSIX定义了一个宏PTHREAD_MUTEX_INITIALIZER 来静态初始化互斥锁

    Java中synchronized的用法

     synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:  1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;  2....

    Java高级工程师面试宝典

    3. 静态同步函数方法上加上 static 关键字,使用 synchronized 关键字修饰 为静态同步函数 九、同步代码块与同步函数区别 答案是:同步代码使用自定锁(明锁)同步函数使用 this 锁 十、多线程死锁 什么是多线程...

    Java 虚拟机面试题全面解析(干货)

    方法区( Method area)被所有线程共享,用于存储已被虛拟机加载的类信息、常量、静态 变量、即时编译器编译后的代码等数据。 和Java堆一样,不需要连续的内存,可以选择固定的大小,更可以选择不实现垃圾收集。 运行时...

    2020面试题总结多线程篇.pdf

    * sleep() 方法是 Thread 类的静态方法,wait() 方法是 Object 超类的成员方法。 * sleep() 方法导致程序暂停指定的时间,让出 cpu 给其他线程,但是它的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态...

    高级开发并发面试题和答案.pdf

    synchronized关键字加在静态方法和实例方法的区别; 用锁的注意点; cas机制可能导致的问题ABA,什么是ABA; 程序开多少线程合适; 实现一下DCL(双重检查锁) stream 和 parallelStream区别; 实现一个阻塞队列(用...

Global site tag (gtag.js) - Google Analytics