Author:老九
计算机专业
可控之事 沉重冷静 不可控之事 乐观面对
85180586@qq.com
☺️
❓ ❤️ ☕️ ❗️
————————————————
版权声明:本文为CSDN博主「浦上青天」的原创文章
总结第二天第三天
线程状态 线程安全问题
线程不安全原因
自增操作不是原子的(加锁)
锁synchronized
多个线程同时修改同一个变量
知识点
第三天 线程状态Thread构造 指定线程名字
Thread的常见属性
Thread的start方法。调用start才是真正在内核中创建出线程(Thread对象和内核中的PCB的生命周期不一样)
线程的中断
a)温和的方式:借助标志位,线程入口方法内部整个循环,循环来判断标志位,能保证当前这次循环结束了再结束线程(结束的不够及时)
b)激烈的方式:interrupt方法(能够及时的让线程内部感知到通知,但是是否真的要结束线程,还是得线程自身说了算)
线程等待join方法,线程A调用了线程B的join方法,此时A就阻塞,一直阻塞到B这个线程执行结束。存在的意义就是为了控制线程之间结束先后顺序
获取线程引用:Thread.currentThread哪个线程在调用这个方法,获取到的引用就指向哪个线程
当前线程是通过继承Thread的方式来创建的,类似于this,若用runnable或者lanmda方式创建,就不能用this了
线程休眠sleep方法。线程A调用了sleep,A就被阻塞。阻塞到sleep指定的时间到
线程安全问题NEW:Thread对象有了,但是PCB还没有
RUNNABLE:线程正在CPU上执行或者即将到CPU上执行
WAITING/TIMED_WAITING/BLOCKED:都表示线程被阻塞
TERMINATED:Thread对象还在,但是PCB已经没了
线程不安全原因多线程并发编程最重要,最复杂的问题
线程不安全:多线程并发执行某个代码时,产生了逻辑上的错误,就是“线程不安全”
自增操作不是原子的(加锁) 锁1.线程是抢占式执行的(线程不安全的万恶之源)
因为线程之间的调度完全由内核负责,用户代码中感知不到,也无法控制,线程之间谁先执行,谁后执行,从哪个CPU上下来,用户都无法感知
2.自增操作不是原子的(要么就执行完,要么就不执行)
3.多个线程尝试修改同一个变量
4.内存可见性导致的线程安全问题
5.指令重排序(JAVA的编译器在编译代码的时候,会针对指令进行优化,调整指令的先后顺序,保证原有逻辑不变的情况下,提高程序的运行效率)
synchronized锁:和日常生活中的锁类似(ATM)
特点:互斥的,同一时刻只有一个线程能获取到锁,其他的线程如果也尝试获取锁,就会发生阻塞等待,一直等到刚才的线程释放锁,此时剩下的线程再重新竞争锁
锁的基本操作:1.加锁(获取锁)2.解锁(释放锁)
关键字:synchronized(同步)
synchronized具体使用:
可以灵活指定某个对象来加锁,尔不仅仅是把锁加到某个方法上,如果把synchronized关键字写在方法前,相当于给当前对象(this)来加锁(所谓的i加锁,其实是给某个指定的对象来加锁)
对象new出的对象会给这个对象申请一块内存空间,这个对象内存不仅存储一些代码中指定的属性,还有一个”对象头“,这个就相当于一个boolean,未加锁就是false,加锁了就是true
synchronized几种常见用法
1.加到普通方法前:表示锁this
2.如果加到静态方法前:表示锁当前类的类对象
3.加到某个代码块之前,显示指定给某个对象加锁
多个线程同时修改同一个变量获取同一把锁的时候,可能会出现获取锁的阻塞,一个代码块获取到锁之后,另一个代码块就会等待,直到第一个代码块释放锁的时候,第二个代码块才会获取锁
先赞后看,养成习惯!!!^ _ ^♥♥♥
每天都更新知识点哦!!!
码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘记关注我哦!



