1 java的单例模式中之前的代码写的有问题,不是一定能保证线程安全的,如果有多个线程同时调用该类的得到实例方法就会导致单例不是线程安全的,
如:public static SingleClass getInstance(){
System.out.println("进入得到对象的方法中");
if(singleClass==null){
//线程安全 ,利用虚拟锁 ..将同步锁放在这里,不是安全。是如getInstanceNew方法是安全的
synchronized(unqielink){
System.out.println("进入虚拟锁的控制中");
singleClass=new SingleClass();
System.out.println(singleClass);
}
}
return singleClass;
}
2 这种方式是线程安全,他保证多线程进入后,先进性判断,如果为空则进入创建对象,如果不为空则跳过。
如:public static SingleClass getInstanceNew(){
synchronized(unqielink){//线程安全 ,利用虚拟锁
System.out.println("进入得到对象的方法中");
if(singleClass==null){
System.out.println("进入虚拟锁的控制中");
singleClass=new SingleClass();
System.out.println(singleClass);
}
}
return singleClass;
}
3 synchronized同步块的处理:java中如果遇到synchronized同步块,则每时每刻只有一个子线程能进入同步块中,而其余的没得到锁的子线程只能等待。而同步块之外的方法内容每个子线程都能通过进入方法。所以说synchronized同步块只能保证同步块中每时每刻只有一个子线程能访问,
如:public static SingleClass getInstanceNew(){
synchronized(unqielink){//线程安全 ,利用虚拟锁
System.out.println("进入得到对象的方法中");
if(singleClass==null){
System.out.println("进入虚拟锁的控制中");
singleClass=new SingleClass();
System.out.println(singleClass);
}
}
return singleClass;
}
4 在这里回顾下。synchronized同步方法的处理:java如果遇到synchronized的同步方法(锁的钥匙只有一个),则每时每刻只有一个子线程能访问该方法,其他子线程得不到钥匙的情况下只能等待。
!!!!!!!!综述:这里说明补充了下到单例模式的线程安全,和说明了synchronized的并发(同步块和同步方法)
如:public static SingleClass getInstance(){
System.out.println("进入得到对象的方法中");
if(singleClass==null){
//线程安全 ,利用虚拟锁 ..将同步锁放在这里,不是安全。是如getInstanceNew方法是安全的
synchronized(unqielink){
System.out.println("进入虚拟锁的控制中");
singleClass=new SingleClass();
System.out.println(singleClass);
}
}
return singleClass;
}
2 这种方式是线程安全,他保证多线程进入后,先进性判断,如果为空则进入创建对象,如果不为空则跳过。
如:public static SingleClass getInstanceNew(){
synchronized(unqielink){//线程安全 ,利用虚拟锁
System.out.println("进入得到对象的方法中");
if(singleClass==null){
System.out.println("进入虚拟锁的控制中");
singleClass=new SingleClass();
System.out.println(singleClass);
}
}
return singleClass;
}
3 synchronized同步块的处理:java中如果遇到synchronized同步块,则每时每刻只有一个子线程能进入同步块中,而其余的没得到锁的子线程只能等待。而同步块之外的方法内容每个子线程都能通过进入方法。所以说synchronized同步块只能保证同步块中每时每刻只有一个子线程能访问,
如:public static SingleClass getInstanceNew(){
synchronized(unqielink){//线程安全 ,利用虚拟锁
System.out.println("进入得到对象的方法中");
if(singleClass==null){
System.out.println("进入虚拟锁的控制中");
singleClass=new SingleClass();
System.out.println(singleClass);
}
}
return singleClass;
}
4 在这里回顾下。synchronized同步方法的处理:java如果遇到synchronized的同步方法(锁的钥匙只有一个),则每时每刻只有一个子线程能访问该方法,其他子线程得不到钥匙的情况下只能等待。
!!!!!!!!综述:这里说明补充了下到单例模式的线程安全,和说明了synchronized的并发(同步块和同步方法)
本文探讨了Java中单例模式的线程安全性问题,分析了不同实现方式下的线程安全特性,并详细解释了synchronized关键字在同步块和同步方法中的作用。
2336

被折叠的 条评论
为什么被折叠?



