- volatile:用于将变量标记为“储存于主内存中”。意思就是将变量储存于主内存中,而不是储存在cpu缓存中;相同的读取也是从主内存中读取,而不是从cpu缓存中读取
- 可见性:多线程进行操作时,只要一个线程使数据发生了变化,其他线程也能看到变化
- happens-before保证:保证所有的volatile对象读写操作都在读写之后执行,不会被jvm重排序
- 不能确保原子性
- http:基于tcp/ip协议的一个短连接
- Socket:是一个抽象层;是对tcp/ip协议的一个封装,用户能通过socket直接使用tcp/ip;他处于应用层和传输层之间(http协议位于应用层,tcp位于传输层,ip位于网络层)
- 物理层-数据链路层-网络层-传输层-会话层-表示层-应用层
- http是无状态无连接的:
- 无连接:tcp一次只能处理一个请求响应,想要进行持久的连接,http1.0有了一个connection Keep-Alive,向服务器请求持久连接,如果服务器允许,就会在响应报文中加上相同的字段(http1.0 所有连接都是串行的,这样就会阻塞线程;http1.1提出了Pipelining概念,客户端发起一个请求不比等待响应直接发起第二个请求,服务端按顺循执行,依次返回结果)
- 无状态:指的是客户端每次发送的请求对于服务端来说都是一个新的请求,上一次会话和下一次会话并没有关系
- http优点:解放了服务器,不会造成不必要的连接占用
- http缺点:每次请求都会传输很多重复的信息
- JVM:
- 一个java程序对应一个jvm
- jvm构造体系:
- classloader类加载器
- 执行引擎
- 运行时方法区(方法区、堆、java栈、PC寄存器、本地方法栈)
- 进程中堆和方法区共享,线程私有程序计数器、本地方法栈、虚拟机栈
- 堆:主要用来存放对象
- 栈:主要用来执行程序
- 方法区:用于存放已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据
- java中==的比较:
- 基础类型比较的是他们的值
- 对象比较的是他们的指向(内存地址)
- java中equals的比较:
- 如果不重写equals,比较方式与==相同
- 重写equals,根据重写的方法进行比较;有必要一提的是,重写equals必须重写hashcode,因为有规定,如果equals返回为true的话,hashcode一定要相同;反之,hashcode相同,equasl也有可能为false
- java8 hashmap扩容
- hashmap默认容量为16,扩容因子0.75,阀值16*0.75=12
- 链表转红黑树条件:
- 链表长度大于8
- 数组长度大于64
- hashmap put操作:(hash(key)获取key的 hashcode ➡️判断table是否存在,如果存在,则继续执行,如果不存在,则执行resize操作➡️hash()取模运算,计算key存在table的哪个位置,如果table(I)有数据,则判断是链表还是红黑树,if tree instanceof treenode 如果是红黑树,则直接执行插入操作,如果不是红黑树,则判断链表长度是否大于8,如果是就将链表转换为红黑树,如果table(I)没有数据,则进行插入操作➡️++size ++modCount➡️在判断数组长度是否超过了阀值,如果超过了,再执行resize操作)
- hash(key)获取table,如果table==null,则执行resize()
- 如果table存在, 则执行取模运算,计算出key所在位置,table(i)
- 如果table(i)存在数据,则判断是链表还是红黑树;如果是链表,则插入之后判断长度是否大于8,大于8 的话执行链表转红黑树;
- 如果table(i)不存在数据,则执行写入操作
- 判断数组长度是否达到阀值,如果达到了,则进行扩容resize()