本文编辑于 2018/10/13 不可能侵权,所以不删
Java后端的开发,肯定会用到线程的知识,因为作为服务器怎么说也得处理高访问量的并发问题.
Java的并发编程是一门进阶知识,那么相对的
说起来,线程因为能使得程序同时执行多个任务.
就可以实现很多场景,例如:
多线程下载(随机IO好像会用到),,,分发任务什么的...
所以在方便的同时也会带来安全的问题:
问题研究的方向在于:线程安全
,线程之间的通讯
...
说起来就很多东西了,所以我选择碎碎念...
java中线程的创建
这个知识倒挺基础的,,要么extends Thread
要么implements Runable
后者用的多是因为java可以多实现而不能多继承
但是实际上开发是用线程池
的 2333 所以前面的了解就行了
Java中线程的类别
有那么两种:
用户线程: 用户线程是指用户自定义创建的线程,主线程
停止时,用户线程
也不会停止.
守护线程: 这个就刚好相反了,主线程
一旦停止就会跟着销毁,例如大名鼎鼎的gc线程
java中定义守护线程使用setDaemon(true)
方法定义.
java的锁呀
锁就很厉害了,关于锁的多种实现
这个以后再补充
为什么会有锁呢,因为有些时候你在进行读写的时候,要保证数据的一致性呀什么的,防止误读幻读什么的,就需要用到锁了,加锁是解决多线程安全问题的一个最常用的方法
java现在嘛
有两种锁:
内置锁
: 是一种互斥锁,能保证线程的原子性,就我们经常看见的那个synchronized
修饰符,这个修饰符吧,就很厉害,它既能保证线程的原子性也能保证线程的可见性,毕竟是加锁...没锁就不能进行被锁起来的代码的运行. 但是相对的,因为有锁,每个线程进来就得读锁和等待,就会造成锁的竞争,因此实现同步的代价就是降低程序的运行效率呀...
也还有那么一种灵活的,开销不大的锁
显示锁
:java 的 Lock 包...
说到用锁来解决多线程安全问题...
这里不得不提一下关于Java的内存模型
了(JMM)
JMM是一个抽象的概念,自行百度:JMM决定一个线程对共享变量的写时,能够对另一个线程可见...
这是解决多线程安全问题的最优的场景
前面提到:synchronized
既能保证线程的原子性也能保证线程的可见性.但是对内存消耗高
其中不得不提一下:jvm为了优化性能会对变量的操作进行指令重排
,如果是单线程的话,这会提高效率,但是对于共享变量呐,,,就有可能出现他值还没修改完,但是却被另一个线程给使用了
而都用synchronized
来弄的话开销又太大,因此java就想出来了一个修饰符用来告诉jvm取消对该变量的指令重排了,这就能轻量级地保证变量的可见性...
那就常用的:volatile
厉害吧
之前有个疑问,什么时候用volatile
修饰符呢
emmm 开发久了之后发现,凡是共享变量,加了就不亏...23333 实际上的时机请自行百度
感谢无聊的你瞅完,对于你浪费的时间我可是不负责的2333,能云淡风轻看完这没用的文字的也就只能是因为是自己写的吧. 互勉.
网友评论