您的位置:首页 > 职场人生

黑马程序员--JAVA基础复习之多线程(二)线程安全与解决方法

2013-08-14 14:23 549 查看
-------
android培训、java培训、期待与您交流! ----------

多线程安全问题

问题的原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误。

解决方法:对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行。

同步

解决安全问题的方法:只要将操作共享数据的语句在某一时段让一个线程执行完,在执行过程中,其他线程不能进来执行就可以解决这个问题。

同步的前提:

1,必须要有两个或者两个以上的线程,才需要同步。

2,多个线程必须保证使用的是同一个锁。

JAVA对于多线程安全问题提出了专业的解决方式。就是同步代码块。

synchronized (obj) {   //obj 位置是一个对象锁,对象可以任意。

   涉及操作共享数据的语句

}

同步的第二种表现形式:



同步函数:其实就是将同步关键字定义在函数上,让函数具备了同步性。

同步函数关键字 synchronized

格式如public synchroonized void test(){}

同步函数是用的哪个锁呢?

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

当同步函数被static修饰时,这时的同步用的是哪个锁呢?

静态函数在加载时所属于类,这时有可能还没有该类产生的对象,但是该类的字节码文件加载进内存就已经被封装成了对象,这个对象就是该类的字节码文件对象。

所以静态加载时,只有一个对象存在,那么静态同步函数就使用的这个对象。

这个对象就是 类名.class

同步死锁:通常只要将同步进行嵌套,就可以看到现象。同步函数中有同步代码块,同步代码块中还有同步函数。

同步代码块解决售票线程安全问题





主函数



多线程下的单例设计模式






-------
android培训、java培训、期待与您交流! ----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐