JMM

JMM内存模型:Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。

内存栅栏
每个线程都有一个私有内存,有一个主内存的副本
Violtate,保证副本和主内存一致,即更新副本的时候一定即是更新主内存

final ReentrantLock lock = this.lock;
lock.lock

原因一、为了加快访问速度
将全局变量赋值给方法的一个局部变量,访问的时候直接在线程栈里面取,比访问成员变量速度要快,读取栈里面的变量只需要一条指令,读取成员变量则需要两条指令;

原因二、为了安全。

单例模式:
1.懒汉是调用方法的时候才创建对象,有线程安全问题,要使用双重synchronzied加volatile
2.饿汉是事先就实例化一个,线程安全
3.内部类
4.枚举

单线程不怕指令重排序,多线程 执行重排序可能改变原有的语义。
写Final域,
编译器会在final域写之后,构造函数return之前,插入一个storestore屏障。这个屏障可以禁止处理器把final域的写,重排序到构造函数之外。
在多线程的时候,如果不是final变量,线程A对类实例化(里面有对变量初始化)后,线程B读到这个对象,访问对象里的变量可能是初始化前的值。

读final域
重排序规则可以确保:在读一个对象的final域之前,一定会先读这个包含这个final域的对象的引用。

  • 位与 & (1&1=1 1&0=0 0&0=0)
  • 位或 | (1|1=1 1|0=1 0|0=0)
  • 位非 ~ ( ~1=0 ~0=1)
  • 位异或 ^ (1^1=0 1^0=1 0^0=0) - - - - 同为0,异为1
  • <<有符号左移 >>有符号的右移 >>>无符号右移 例如:8 << 2 = 32 8>>2 = 2

1字节(byte)=8个比特(bit) (bit就是比特位的意思)
char :2个字节
short :2个字节
int :4个字节
boolean :4个字节
float :4个字节
long :8个字节
double :8个字

求key的hash,做了几次转换,下面是1.8jdk的hashmap取hash的方法
hash = (h = key.hashCode()) ^ (h >>> 16);高16位保留,低16位和高16位做异或结果做低16位,低16位是主要的。
(1次位运算+1次异或)

n = table.length;
index = (n-1) & hash; 主要是应用低16位,因为n-1 通常不能超过16位
N都是2的次幂减1后 是 7=111 15=1111 31=111111等

目的是为了能同时使用高16位和低16位
使用异或,是最后算出的值更加均匀 如果是用或和与都增大重复的概率

hashmap减少hash冲突 使用链地址法

jetty是一个servlet容器 = jboss等
netty是个网络框架,是个库
reactor 是一个模式,netty等都利用,
对于io复用有3种实现方式 select O(n) poll O(n) epool O(1)
1.select接受不阻塞
2.把io事件注册到selector上 selector相当于一个观察者或者叫监听者(observable),把一些服务端和客户端的SocketChannel , ServerSocketChannel
注册到selector,相当于是被观察的对象,然后指定一些观察哪些事件,比如 op_connect op_accpet op_read等
3.轮询selector
4.异步task执行io事件

堆区 :只要是new出来的
栈:引用 线程私有

基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收。
用new创建对象,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完成(局部变量生命周期结束)后从栈空间回收,堆空间区域等待GC回收。
数组既在栈空间分配数组名称, 又在堆空间分配数组实际的大小!

通常说的栈即虚拟机栈,是用来运行程序的。而堆只是存放对象的
每个java方法在执行时,会创建一个“栈帧(stack frame)”,栈帧的结构分为“局部变量表、操作数栈、动态链接、方法出口”几个部分。
方法入栈相当于向水桶里倒水,出栈相当于出水,桶口是栈顶。(栈是线程隔离的,递归方法 StackOverflow 异常,while创建线程会发生OutOfMemoryError
异常)
方法区主要存类的一些东西.

使用
Callable与Future创建线程
使用 ExecutorService线程池来提交Callable任务

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值