1:什么是线程安全问题
当多个线程共享一个全局变量做写操作的时候,可能会受到其他线程的干扰,导致数据有问题,这叫做线程安全问题;
注意:1:做读的时候不会产生线程安全;
2:如果是局部变量,也是做写的操作,是不会造成线程安全问题的;
2:线程如何实现同步
同步:多个线程共享同一个全局变量,数据安全问题——保证数据的原子性;
1:synchronized同步代码块
条件:
1:必须要有2个线程以上,需要发生同步;
2:多个线程想同步,必须用同一把锁;
3:保证只有一个线程进行执行;
原理:
1:有一个线程已经拿到了锁,其他线程已经有cpu的
执行权,一直排队,等待其他线程释放锁,
2:锁是在什么时候释放?代码执行完毕或抛出异常都会被释放掉
3:锁已经被释放掉的话,其他线程开始获取锁进行同步中去;
4:锁的资源竞争,
5:死锁的问题.锁不释放
弊端:多个线程需要判断锁,较为消耗资源,抢锁的资源
2:同步函数
在方法上面加synchronized;
1:使用的是什么锁? this锁;
2:如果一个线程使用的同步函数,另外一个线程使用的是同步代码块()只有this锁才能保证同步;
3:静态代码块:不使用this锁;当前类的字节码文件;
4:多线程死锁:同步中嵌套同步,无法释放,一致等待,变为死锁
多线程三大特性
原子性,保证线程独一无二,保证线程安全问题
可见性:java内存模型
有序性:join wait notify 多线程之间通讯
volatile关键字,AtomicInteger原子类
volatile::1场景:就是主线程修改了数据之后刷新到了主内存,而子线程的数据并没有更新;
2:主要是在线程中做了一些sleep操作等才会导致与主内存的刷新不及时;
3:缺点:就是不保证原子性,就是不保证线程安全问题
AtomicInteger: JDK1.5并发包里的 计数用的; 保证元素的原子性,保证线程安全问题;
ThreadLocal::是本地线程,为每一个线程提供一个局部变量;底层就是map,key就是当前线程对象;
java内存模型
1属于多线程可见性 jmm
2:决定了一个线程与另一个线程的是否可见.
3:主内存(主要存放共享的全局变量) 私有本地内存(本地线程私有变量)
注意:本地内存存放的是共享数据的副本;
java内存结构? 指的是jvm内存分配;栈、堆、方法区等;