《笔记》1.学习高并发
读者,你好!这是我的第一篇Blog,纯属记载学习https://my.oschina.net/hosee/blog/597934高并发知识时候的一些记录和个人领悟!
高并发就是同一时刻有多个线程访问了同一个数据资源;
常见而说不出口的名词
- 同步 :你得等待上一个请求完成才能在发送请求;
- 异步 :你发送请求时不需要等待上一个请求结束;
- 并行 :(并肩前行嘛?)两条生产线上的流水,共同前行,互不影响 (单CPU是无法实现的);
- 并发 :一个生产线,一会这个任务运行一下,一会又切换另一个任务执行一会 (多任务交替进行);
- 临界区 ,见图:(个人理解就是:资源占用区间)

- 死锁 所有线程都处于互相等待的一种静止状态;(资源相互竞争/线程间相互通信造成的阻塞)
- 活锁 所有线程都在相互交换仅有的资源(部分),造成谁也没有机会得到所有资源造成阻塞的一种动态;
- 饥饿 是指线程一直得不到所需资源,而得不到执行的状态;
- 并发级别的阻塞和非阻塞:
- 阻塞:当一个线程进入临界区时,其他线程都必须等待;
- 非阻塞:可分为无障碍,无锁,无等待
- 无障碍:(最怂的的非阻塞调度,不能确保有竞争是一定能完成操作)
- 自由进出临界区
- 无竞争时,有限步完成操作,尽快释放
- 有竞争时,(立马放弃,回滚数据)
- 无锁(可解决无障碍的问题,至少保障所有线程都能执行下去 广泛使用)
- 无障碍的(即包含无障碍的特性)
- 保证有线程可以获得资源
无锁代码可以参考链接文中(大佬代码就不复制,尊重一下)
- 无等待(最优状态,但难以实现)
- 无锁的
- 要求所有线程都要在有限步内完成操作即无饥饿的(即使优先级极低也是可以完成的,不会一直处于等待)
- 无障碍:(最怂的的非阻塞调度,不能确保有竞争是一定能完成操作)
进程&线程
- 线程是进程的执行单元
- 多进程一般不考虑并发,并发通常为多线程设计;
- Jvm将会把Java中的线程映射到操作系统的线程区;
- 线程启动:Thread.start()
- 优雅的线程中断示例:
public void run(){
while(true)
{
if(Thread.currentThread().isInterrupted())
{
System.out.println("Interruted!");
break;
}
Thread.yield();
}
}
使用中断,保证了数据的一致性。
对于可取消的阻塞状态中的线程, 比如等待在这些函数上的线程, Thread.sleep(), Object.wait(), Thread.join(), 这个线程收到中断信号后, 会抛出InterruptedException, 同时会把中断状态置回为false.
对于取消阻塞状态中的线程,可以这样抒写代码:
public void run(){
while(true){
if(Thread.currentThread().isInterrupted()){
System.out.println("Interruted!");
break;
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
System.out.println("Interruted When Sleep");
//设置中断状态,抛出异常后会清除中断标记位
Thread.currentThread().interrupt();
}
Thread.yield();
}
}
-
线程关闭:太暴力不推荐(容易导致数据不同步)Thread.stop()==>直接释放所有monitor?是我的风格
-
线程中断:(并非立马停止,只是将线程的.isInterrupted状态改为true,提醒他接下来你要自己找个合适的时机准备停下来)但实际上并没有停下来,只是改个状态而已
public void Thread.interrupt() // 中断线程
public boolean Thread.isInterrupted() // 判断是否被中断
public static boolean Thread.interrupted() // 判断是否被中断,并清除当前中断状态 -
yeild
-
yeild是个native静态方法,这个方法是想把自己占有的cpu时间释放掉,然后和其他线程一起竞争(注意yeild的线程还是有可能争夺到cpu,注意与sleep区别)。
-
join
-
方法的意思是等待其他线程结束
未完待续 >a<
谢谢观看,如有理解错误的地方,烦请指出 >#<

305

被折叠的 条评论
为什么被折叠?



