A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小龟 中级黑马   /  2015-4-15 23:40  /  550 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

同步:
好处:解决了线程安全问题。
弊端:相对降低性能,因为判断锁需要消耗资源,产生了死锁。

定义同步是有前提的:
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;
        }
}

11 个回复

倒序浏览
欢迎 分享!
回复 使用道具 举报
总结的不错
回复 使用道具 举报
不错 不错
回复 使用道具 举报
顶一个   
回复 使用道具 举报
受教受教...
回复 使用道具 举报
不服不行,楼主就是有水平
回复 使用道具 举报
顶!!!!!!!
回复 使用道具 举报
说的不错!
回复 使用道具 举报
虽然还没有学同步函数,不过看看你的帖子先预习了解一下
回复 使用道具 举报
嗯,不错!!!顶了
回复 使用道具 举报
顶一个 ,不错呀
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马