黑马程序员技术交流社区

标题: 关于同步的笔记 [打印本页]

作者: 小龟    时间: 2015-4-15 23:40
标题: 关于同步的笔记
同步:
好处:解决了线程安全问题。
弊端:相对降低性能,因为判断锁需要消耗资源,产生了死锁。

定义同步是有前提的:
1,必须要有两个或者两个以上的线程,才需要同步。
2,多个线程必须保证使用的是同一个锁。

同步的第二种表现形式:
同步函数:其实就是将同步关键字定义在函数上,让函数具备了同步性。

同步函数是用的哪个锁呢?
通过验证,函数都有自己所属的对象this,所以同步函数所使用的锁就是this锁。

当同步函数被static修饰时,这时的同步用的是哪个锁呢?
静态函数在加载时所属于类,这时有可能还没有该类产生的对象,但是该类的字节码文件加载进内存就已经被封装成了对象,这个对象就是该类的字节码文件对象。
所以静态加载时,只有一个对象存在,那么静态同步函数就使用的这个对象。
这个对象就是 类名.class

同步代码块和同步函数的区别?
同步代码块使用的锁可以是任意对象。
同步函数使用的锁是this,静态同步函数的锁是该类的字节码文件对象。

在一个类中只有一个同步,可以使用同步函数。如果有多同步,必须使用同步代码块,来确定不同的锁。所以同步代码块相对灵活一些。

考点问题:请写一个延迟加载的单例模式?写懒汉式;当出现多线程访问时怎么解决?加同步,解决安全问题;效率高吗?不高;怎样解决?通过双重判断的形式解决。
//懒汉式:延迟加载方式。
当多线程访问懒汉式时,因为懒汉式的方法内对共性数据进行多条语句的操作。所以容易出现线程安全问题。为了解决,加入同步机制,解决安全问题。但是却带来了效率降低。
为了效率问题,通过双重判断的形式解决。
class Single{
        private static Single s = null;
        private Single(){}
        public static Single getInstance(){ //锁是谁?字节码文件对象;
                if(s == null){
                        synchronized(Single.class){
                                if(s == null)
                                        s = new Single();
                        }
                }
                return s;
        }
}
作者: ぃ鉲布奇诺    时间: 2015-4-15 23:47
欢迎 分享!
作者: 知来者之可追    时间: 2015-4-16 10:42
总结的不错
作者: 只吃饭不洗碗    时间: 2015-4-16 16:09
不错 不错
作者: 丿天邪    时间: 2015-4-20 21:33
顶一个   
作者: 18561271203    时间: 2015-4-20 22:03
受教受教...
作者: itheima_llt    时间: 2015-4-20 22:17
不服不行,楼主就是有水平
作者: itheima_llt    时间: 2015-4-20 22:49
顶!!!!!!!
作者: itheima_llt    时间: 2015-4-20 23:11
说的不错!
作者: 莫里亚蒂    时间: 2015-4-20 23:20
虽然还没有学同步函数,不过看看你的帖子先预习了解一下

作者: 李维、、    时间: 2015-4-20 23:34
嗯,不错!!!顶了
作者: kolyneh    时间: 2015-4-20 23:46
顶一个 ,不错呀




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2