多线程线程安全

1.什么是线程安全问题?
当多个线程共享同一个全局变量,做写的时候可能会受到其他线程的
干扰,导致数据由问题,这种现象叫做线程安全问题。但是做读的
操作是不会发生数据冲突问题。
2.多个线程共享同一个局部变量会发生线程安全问题?
不会。
3.线程安全问题有哪些解决方法?
使用多线程之间同步synchronized或者使用锁(lock)
lock--jdk.5并发包--手动
synchronized--自动

一.什么地方考虑加锁?
1.必须要有两个线程以上
2.多个线程想同步,必须用同一把锁。
3.保证只有一个线程进行执行
二.为什么使用线程同步或者锁能解决线程安全问题?
将可能发生数据冲突问题(线程不安全问题),只能让当前一个线程
进行执行,代码执行完毕后,释放锁,然后让其他线程进行执行,在这样
的话可以解决线程不安全问题。
同步原理?
1.有一个线程已经拿到了锁,其他线程已经有cpu执行的,一直
排队,等待其他线程释放锁。
2.锁的在什么时候释放?
代码块执行完毕或者是程序抛出异常都会被释放掉。
3.锁已经被释放掉的话,其他线程开始获取锁进入同步区。
4.锁这个资源的竞争。
缺点:
多个线程需要判断锁,较为耗资源,抢锁的资源,效率非常低。

1.同步函数?
在方法上加上synchronized。
2.同步函数使用什么锁?
this锁。
3.怎么证明同步函数使用this锁。
两个线程之间实现同步,一个线程使用this锁同步代码块
一个线程使用同步函数,如果这两个线程同步,则证明。
4.静态同步函数使用锁?
该函数字节码文件对象。
5.尽量不要使用静态同步函数,非常占内存。
6.共享的全局变量是静态的或者是非静态的和同步函数
或者是静态同步函数没有任何关系。

加锁保证同步,同步保证数据安全问题,原子问题。
分布式锁,高并发和jvm是没有任何关系。
使用synchronized和lock都属于单个jvm中同步。

什么是多线程死锁?
同步中嵌套同步,导致锁无法释放。

一多线程的三大特性?
原子性,可见性,有序性。
原子性:独一无二,一致性,保证线程安全问题
可见性:java内存模型
有序性:join,wait,notify(多线程之间通讯)
二什么是Java内存模型?Java内存结构?
jmm决定一个线程对共享变量的写入时,能对另外一个线程可见。
线程之间共享的全局变量,私有本地内存(本地线程私有变量)
本地内存中存储了该线程以读写共享变量副本,本地内存是jmm的
一个抽象概念,并不真实存在,它涵盖了缓存,写缓冲区,寄存器
以及其他硬件和编译器优化。
总结:什么是Java内存模型,Java内存模型(jmm)定义了一个线程对
另外一个线程可见,共享变量存放在主内存中,每个线程都有自己的
本地内存,当多个线程同时访问一个数据时,可能本地内存没有及时
刷新到主内存,所以会发生线程安全问题。
一什么是Volatile关键字?
Volatile关键字的作用是变量在多个线程之间可见。
线程延迟,本地内存不会立即刷新到主内存



猜你喜欢

转载自blog.csdn.net/qq_38357267/article/details/80972745