给静态方法加同步锁
我们知道利用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线程中同步锁的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
3.线程间同步和通信之互斥锁(动态),通过按键和LED的组合学习互斥锁的功能,理解互斥锁
静态方法(有关同步的细节) 总结 第五章 Java线程编程的例子 数据结构和容器 简单的同步例子 一个网络服务器类 AsyncInputStream类 使用TCPServer和AsynclnputStream 总结 第六章 Java线程调度 线程调度概述 ...
3.同步器是面向锁的实现者,他简化了锁的实现方式,屏蔽了同步状态管理、线程排队、等待和唤醒等底层操作 4.同步器的设计是基于设计模式为:模板方法模式 AQS实现细节: 1.同步器依赖内部的同步队列-FIFO双向队列来...
两个售票窗口同时出售50张票; 程序分析:1.票数要使用同一个静态值 2....售票要使用同步锁:即有一个站台卖这张票时,其他站台要等这张票卖完! 2.创建主方法调用类 里面有源码,导入myeclipse执行
线程的同步与锁,静态方法同步,线程安全类,用实例详细的介绍了线程同步的知识,易于理解!
session简介.doc
1. 静态初始化:如果互斥锁 mutex 是静态分配的(定义在全局,或加了static关键字修饰),可以直接使用宏进行初始化。e.g. pthead_mutex_t muetx = PTHREAD_MUTEX_INITIALIZER; 2. 动态初始化:局部变量应采用动态...
synchronized代码块,被修饰的代码成为同步语句块,其作用的范围是调用这个代码块的对象,我们在用synchronized关键字的时候,能缩小代码段的范围就尽量缩小,能在代码段上加同步就不要再整个方法上加同步。...
文章目录synchronized线程安全主要诱因互斥锁特性获取对象锁同对象,异步同对象,同步代码块同对象,非静态同步方法同对象,同步代码块 对比 非静态同步方法不同对象,同步代码块 对比 非静态同步方法获取类锁和对象...
一、重点知识 isDaemon 判断是否为守护线程。 run方法是不能用synchronized修饰,他是继承来的,不能改变其结构,...stringBuffer中的同步方法,都是非静态的,因为共用一个this锁就可以了,线程进去调用他的一个方法
1.几种同步方法的区别 lock和Monitor是.NET用一个特殊结构实现的,Monitor对象是完全托管的、完全可移植的,并且在操作系统资源要求方 面可能更为有效,同步速度较快,但不能跨进程同步。lock(Monitor.Enter和...
/** * JDBCConnection for Singleton * 双重检查加锁方法,由于JVM... * 同时,jvm的类加载机制保证了绝对不会出现同步问题,避免了双检查锁。 * 优点:延迟加载,而且不需要同步。 * @author Zephyr.Qiao * */
最简单的线程安全的方式:同步方法,效率低 更好的的线程安全的方式:双重校验锁 3. 枚举: public enum Singleton{ INSTANCE; } 5. 作用: 1. 全局配置...
前言: 相信需要了解这方面的知识的小伙伴,已经基本对进程间通信和线程间通信有了一定了解。...有两种方法创建互斥锁,静态方式和动态方式。POSIX定义了一个宏PTHREAD_MUTEX_INITIALIZER 来静态初始化互斥锁
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象; 2....
3. 静态同步函数方法上加上 static 关键字,使用 synchronized 关键字修饰 为静态同步函数 九、同步代码块与同步函数区别 答案是:同步代码使用自定锁(明锁)同步函数使用 this 锁 十、多线程死锁 什么是多线程...
方法区( Method area)被所有线程共享,用于存储已被虛拟机加载的类信息、常量、静态 变量、即时编译器编译后的代码等数据。 和Java堆一样,不需要连续的内存,可以选择固定的大小,更可以选择不实现垃圾收集。 运行时...
* sleep() 方法是 Thread 类的静态方法,wait() 方法是 Object 超类的成员方法。 * sleep() 方法导致程序暂停指定的时间,让出 cpu 给其他线程,但是它的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态...
synchronized关键字加在静态方法和实例方法的区别; 用锁的注意点; cas机制可能导致的问题ABA,什么是ABA; 程序开多少线程合适; 实现一下DCL(双重检查锁) stream 和 parallelStream区别; 实现一个阻塞队列(用...