黑马视频笔记:
线程安全问题的解决:
1,synchronized分为同步代码块和同步函数,使用的时候需要注意的是两者的锁需一致,是this。
如果在同步函数和共享变量上添加static(即静态的同步方法),那么锁又会变成什么?
static方法中不可以定义this,静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象。
所以此时锁是类名.class
2.在单例设计模式中,懒汉式也会出现线程安全问题,修改代码如下:
//懒汉式 延迟加载(只有调用方法的时候才会创建对象,对内存使用的便利)
3 class Single{
2 private static Single s = null;
1 private Single(){}
13 public static synchronized Single getInstance(){ //synchronized加在此处的弊端有:线程很多,每个线程到这的时候获取实例都要判断锁,比较低效
1 if (s == null){
2 s = new Single();
3 }
4 return s;
5 }
6 }
7
8 class SingleDemo{
9 public static void main(String[] args){
10 System.out.println("HelloWorld");
11
12 }
13 }
//修改后的懒汉式
//懒汉式
8 class Single{
7 private static Single s = null;
6 private Single(){}
5 public static Single getInstance(){
4 if(s == null ){
3 synchronized(Single.class){
2 if (s == null){
1 s = new Single();
18 }
1 }
2 }
3 return s;
4 }
5 }