Java线程安全与锁优化
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
Java共享数据的分类
不可变: 不可变数据是绝对线程安全的
绝对线程安全: “不管运行时环境如何,调用者都不需要任何额外的同步措施”
相对线程安全: 对一个对象单独对操作是线程安全对
线程兼容: 本身并非线程安全,但我们可以在调用端使用同步手段来确保在并发环境中可以安全得使用
线程对立: 对象在调用端无论使用何种同步手段,都无法确保安全
线程安全的实现方法
互斥同步: 使用互斥量
非阻塞同步 : 使用原子操作
锁优化
自旋锁与自适应自旋锁: 使用多个忙循环而不是挂起,当忙循环超过某个固定阈值的时候挂起,自适应指得是动态选择阈值
锁清除: 消除不必要的锁
锁粗化: 扩大锁的范围,避免在循环中频繁加锁
轻量级锁: 使用CAS操作,避免互斥加锁,若CAS操作失败,则使用互斥加锁
偏向锁: 让第一个使用对象对线程持有,在第二个线程到来前,不进行任何同步操作。
Java内存模型与线程
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
硬件间速度的差距因为计算机各种硬件之间速度的差距实在是太大了,这严重地影响了计算机的整体效率,很多时候软件并不能够充分地利用计算机的资源,让处理器去等待内存,一种解决方案就是在内存和处理器之间引入一个缓存,来尽量减轻这个速度的差距。在多处理器系统中,往往对应着多个缓存。
缓存一致性往往这些缓存都储存着和内存一样的数据,他们互为拷贝,我们必须保证他们的数据是同步修改的。这有很多种协议来维护。
乱序执行为了更好的利用处理器的运算单元,处理器可能会对输入的代码片段进行乱序执行优化,Java虚拟机也是如此。
Java内存模型Java内存模型中有两种内存,第一种是一个主内存,第二种是多个线程工作内存,线程私有。
内存间的互相操作Java内存模型有8种原子操作lock:作用与主内存中的变量,让其变为线程独占unlock:和lock相反read:把主内存中的变量传输到工作内存,准备loadload:把 ...
Java内存区域于内存溢出异常
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
Java运行时的数据区域方法区、虚拟机栈、本地方法栈、堆、程序计数器
程序计数器线程私有为了支持多线程,Java虚拟机为每个线程设置独立的程序计数器,各条线程之间计数器互不影响,独立储存。如果线程执行的是Java方法,计数器指向正在执行的字节码指令地址,如果线程执行的是Native方法,这个计数器则为空程序计数器区域是唯一一个没有任何OutOfMemoryError情况的区域。
Java虚拟机栈线程私有每个方法在执行的同时都会向虚拟机栈申请一个栈帧用于储存局部变量表、操作数栈、动态链接、方法出口等信息,每个方法的调用直到执行完成,对应一个栈帧在虚拟机栈中入栈到出栈的过程,局部变量表存放了方法执行过程中的所有局部变量,编译期间就确定了。所以,这个栈帧的大小是完全固定的。虚拟机栈会有StackOverflowError和OutOfMemoryError,前者在固定长度的虚拟机栈中出现,后者在变长 ...
走进Java
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
what’s that这是学习《深入理解Java虚拟机》周志明 著. 的笔记
Java 的优点结构严谨、面向对象、脱平台、相对安全的内存管理和访问机制、热点代码检测和运行时编译及优化、拥有完善的应用程序接口及第三方类库……
JDK,JRE,Java SE API 的区别图片来源于《深入理解Java虚拟机》
Java平台Java Card: 支持一些Java小程序运行在校内次设备(智能卡)上的平台Java ME: 支持Java程序运行在移动终端上的平台,对Java API所精简Java SE: 支持面向桌面级应用的平台,有完整的Java核心APIJava EE:支持多层架构的企业应用的平台,出Java核心API外还做了大量补充
Sun HotSpot VM这是Sun JDK和OpenJDK中所带的虚拟机
EulerTourTree
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
Euler Tour Tree任何一颗树都能够用欧拉旅行路径来表示,欧拉旅行路径是一个序列,他记录了一颗树的dfs的时候的顺序,记录了进入每个节点的时间和退出该节点的时间,这样以后,子树就成了ETT上连续的区间,当我们对子树进行交换的时候,我们就可以将这个区间平移。这里我们用splay维护即可
kernelFunctions
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
kernel functions核函数是一个函数,他能够把低纬空间映射到高维空间,他的输入是低维空间的两个点,他的输出是这两个点在高维空间上的内积。
why kernel functions某些在低维空间无法使用超平面分割的点集,他们被某些函数映射到高维空间以后,能够被超平面分割。并且在高维空间中计算他们的内积很容易(就是核函数)
应用
Simple Example: x = (x1, x2, x3); y = (y1, y2, y3). Then for the function f(x) = (x1x1, x1x2, x1x3, x2x1, x2x2, x2x3, x3x1, x3x2, x3x3), the kernel is K(x, y ) = (<x, y>)².Let’s plug in some numbers to make ...
Lnorm
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
L范数常见的L范数有三种$L_0 norm,L_1 norm,L_2 norm$
$L_0范数$$L_0范数$指的是向量中非0项的个数
$L_1范数$$L_1范数$是曼哈顿距离
#L_2范数#$L_2范数$是欧几里得距离
metric_space
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
metric space度量空间metric space是一个度量metric的集合,通常度量metric是定义在某点集上的函数,
metric度量必须满足下面四个条件
the distance from a point to itself is zerothe distance between two distict point is positivethe distance from A to B is the same as the distance from B to Athe distance from A to B(directly) is less than or equal to the distance from A to B via any third point C
表达通常我们使用有序对(M,d)来表示度量空间,M是集合,d是集合M上的度量
代更参考wikipedi ...
软件需求复习
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
软件工程与软件需求
什么是软件
软件是使硬件充分、自动、智能化地发挥作用的纽带
软件是用户和计算机硬件之间的接口和桥梁
软件开发的目标是什么
为用户提供满意的软件产品或服务
什么是需求
需求是在一定的时期,在一既定的价格水平下,消费者愿意并且能够购买的商品数量
软件开发瀑布模型
需求分析、设计、编码、测试、维护
软件项目成功的主要因素
*用户的参与
执行层的支持
*清晰的需求描述
合理的规划
*现实的客户期望
软件项目失败的主要因素
*不完整的需求
*缺乏用户参与
资源不足
*不切实际的用户期望
缺乏执行层的支持
*需求变更频繁
规划不足
*提供了不再需要的
缺乏IT管理
技术能力不足
需求工程包括那两个部分
需求开发和需求管理
需求开发包括哪些基本过程
业务需求定义、需求获取、需求分析与建模、需求描述、需求验证
需求定义
什么是 ...
珂朵莉树
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
珂朵莉树珂朵莉树是一颗树,我们用集合来维护,c++中集合是红黑树,所以我们借助此集合来完成珂朵莉树。我们将区间分段,那么各段有唯一的左端点,我们将左端点放入集合,当我们遍历集合的时候,我们就得到了我们要的序列,此时我们维护了结构,但未维护值,进一步发现我们可以使用map,用键值对来维护更多信息,键用来维护树的结构,值来维护序列的值。
split因为我们要维护区间信息,所以我们需要操作split来提取区间,本质上提取区间为提取单点,这一点在splay中表现的很出色,当我们提取出左端点和右端点的时候,区间也就被提取出来了,如果提取位置x,在红黑树中我们二分到x的位置,若此处是一个区间[l,r],我们将此区间拆分为[l,x-1][x,r]即可。
assign我们提取出区间,删掉这些节点然后,插入一个新的节点即可
add我们提取出区间,暴力更新所有节点即可
sum我们提取出区间,暴力计算所有节点, ...