IO&&JVM&&JUC

BIO(block) :传统IO, javase中的阻塞式IO,如果当前线程IO阻塞,不能做其他操作。为了解决BIO在单线程的阻塞情况,需要使用多线程来解决。
NIO(NOT):非阻塞IO,采用轮询算法查找注册的客户端,体现在先在客户端和服务端建立多个通道,可以多路复用进行连接。建立了读写的缓冲区。netty 就是一个nio的框架。selector原本是是单线程,在netty中是多线程。
AIO
Java AIO即Async非阻塞,是异步非阻塞的IO。

BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

多个线程同时工作不出问题是因为DMA控制器。
epoll:一种使用单线程实现高并发的方案。ningx就用的epoll。建立了一块os和用户共用的空间,减少了复制的过程,内部以事件通知方式检测套接字(加监听器使套接字主动发请求)。

JVM(Java Virtual Machine):能够运行java字节码的虚拟机。
Java内存分为heap和stack,stack里真正跑程序,放方法,heap里放对象实例。
调优调的是heap和方法区。stack归Java管理。
方法区:静态变量+常量+类信息+运行时常量
堆:对象实例,用来存储,很大,stack是运行。
新生代:发生轻GC。内存小,慢了转移到老年代。分为Eden,from,to,from和to1:1
老年代:空间大,放存活时间长,占用内存多的,产生full GC

不受synchronize修饰的方法和守修饰的是异步的。syn锁的是方法的调用者,如果是static class则全局唯一,会将这个类锁住。juc提供了Collection.synchronized(List,map),高效的CopyOnwriteArrayList<>(),
//写入时复制,读取时固定,写入时避免覆盖造成数据不一致,先复制一份,读写分离的思想,不使用syn,用lock提高效率
hashset底层就是hashmap使得key无法重复

runnable不会抛出异常,也没有返回值,callable有。可以指定一个泛型然后返回。需要实现带返回值的call方法。
semaphore 是一个类,可以设置初始最大量,有require (-1) release(-1)方法。readWriteLock.writelock()//写锁(独占锁)。readlock是读锁(共享锁),防止脏读
blockingQueue.offer(“d”,1,TimeUint.SECONDS);//插入2,插入失败等待2s
SynchoronousQueue//同步队列,进一个出一个。
池化技术:事先准备好资源,有需要就来拿,用完了归还可以重复使用。降低资源消耗,提高响应速度,方便管理,可控制最大并发数。
线程池拒绝策略:不处理,抛出异常;队列满了不抛出异常;队列满了尝试竞争队列空间,也不会抛出异常。
mapreduce;把大任务拆分为小任务,再将结果分支合并。
forkjoin:适合大数据。工作窃取:用双端队列快的进程窃取慢的进程的任务。
volatile:保证可见性,不保证原子性(比如add(){++num;},无效,因为可以保证num有效,但不能保证这个方法有效),禁止指令重排。
JMM:Java内存模型,一个约定:
1.线程解锁前,必须及时刷新共享变量。
2.线程加锁前必须读取主存中的最新值到工作内存。
3.加锁和解锁必须是同一把锁。

指令重排:程序执行顺序和代码顺序不一致,会重排。
CAS(compare and set):期望值达到了就更新,否则不更新,是cpu的并发原语。利用自旋锁,底层调用的c。缺点:自旋锁循环费时(但还是比Java高),一次只能操作一个共享变量,ABA问题
ABA问题:一个慢进程期望数被快进程修改了多次,最后是慢进程期望的。解决方法原子引用,给原子加版本号。

公平锁:FIFO。
非公平锁:可以插队,默认执行方式。(Lock,syn等)。
可重入锁(递归锁):拿到了外面的锁也就自动拿到了里面的锁。
自旋锁:与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。

死锁排查:1.日志 2.查看堆栈信息
守护进程是一个在后台运行并且不受任何终端控制的进程。用来执行一些特定的任务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值