多线程的安全问题

来源:互联网 发布:mac上面菜单栏设置颜色 编辑:程序博客网 时间:2024/06/05 21:52

关于多线程安全问题的原因:一个线程在执行多条语句时,并运算同一数据时,在执行过程中,其他线程参与进来,操作了这个数据。导致了错误数据的产生。
其涉及到的两个因素:
1,多线程在操作时共享数据。
2,有多条语句对共享数据进行运算

原因;这多条语句,在某一时刻被一个线程执行时,还没有执行完,就被其他线程执行了。这里写图片描述

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

如何进行多句操作共享数据代码的封装呢?
Java中提供了一个解决方案:就是同步代码块
格式:
Synchronized(对象){ 任意对象都可以。这个对象就是锁。
需要被同步的代码块
}
这里写图片描述

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

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

这里写图片描述

同步函数使用哪个锁?
通过验证,函数都有自已所属的对象this,所以同步函数所使用的锁就是this锁。
这里写图片描述

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

这里写图片描述

考点问题:请问一个延迟加载的单例模式?写懒汉式;当出现多线程访问时怎么解决?加同步,解决安全问题;效率高吗?不高怎么解决?通过双重判断的形式解决。
//懒汉式: 延迟加载方式
当多线程访问懒汉式时,因为懒汉式的方法内对共性数据进行多条语句的操作。所以容易出现线程安全问题。为了解决,加入同步机制,解决安全问题。但是却带来了效率低。
为了效率问题,通过双重判断的形式解决。
这里写图片描述

同步死锁:通常只要将同步进行嵌套,就可以看到现象。同步函数中有同步代码块,同步代码块中有同步函数。
这里写图片描述

线程间通信:
思路:多个线程在操作同一个资源,但是操作的动作不一样。
1.将资源封装成对象,
2.将线程执行的任务(任务其实就是run方法),也封装成对象

等待唤醒机制:涉及的方法:
Wait :将同步中的线程处于冻结状态,释放了执行权,释放了资格。同时将线程对象存储到线程池中
Notify:唤醒线程池中的某一个等待线程。
notifyAll 唤醒的是线程池中的所有线程。
这里写图片描述

注意: 1.这些方法都需要定义在同步中
2.因为这些方法必须要有表示所属的锁。
你要知道A锁上的线程被wait了,那么这个线程就相当于处于A锁的线程池中,只能A锁的notify唤醒。
3.这三个方法都定义在Object类中。为什么操作线程的方法定义在Object类中?
因为这三个方法都需要定义在同步内,并表示所属的同步锁,既然被锁调用,而又可以是任意对象,那么能被任意对象调用的方法一定定义在Object类中。

原创粉丝点击