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

时间:2021-05-16 00:19:02

------- android培训java培训、期待与您交流! ----------


多线程安全问题


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

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


同步


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

同步的前提:

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

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

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

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

   涉及操作共享数据的语句

}


同步的第二种表现形式:


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

同步函数关键字 synchronized

格式如public synchroonized void test(){}


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

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


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

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

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

这个对象就是 类名.class


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



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


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

主函数

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




多线程下的单例设计模式


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


------- android培训java培训、期待与您交流! ----------