-
轻量级锁
2018-11-07 09:55:02轻量级锁是由偏向锁升级来的,偏向锁运行在一个线程进入同步块的情况下,当第二个线程加入锁争用的时候,偏向锁就会升级为轻量级锁(又叫做锁膨胀); 轻量级锁也被称为非阻塞同步、乐观锁,因为这个过程并没有把...轻量级锁是由偏向锁升级来的,偏向锁运行在一个线程进入同步块的情况下,当第二个线程加入锁争用的时候,偏向锁就会升级为轻量级锁(又叫做锁膨胀);
轻量级锁也被称为非阻塞同步、乐观锁,因为这个过程并没有把线程阻塞挂起,而是让线程空循环等待,串行执行。
轻量级锁适用于那些同步代码块执行的很快的场景,这样,线程原地等待很短很短的时间就能够获得锁了。轻量级锁膨胀之后,就升级为重量级锁了。
轻量级锁主要有两种
①自旋锁
②自适应自旋锁
-
Vue轻量级富文本编辑器-Vue-Quill-Editor
2018-09-04 19:51:35文本方向 [{ 'size': ['small', false, 'large', 'huge'] }], // 字体大小 [{ 'header': [1, 2, 3, 4, 5, 6, false] }], //几级标题 [{ 'color': [] }, { 'background': [] }], // 字体颜色,字体背景颜色 [{ 'font'...先看效果图:女神镇楼
- 下载Vue-Quill-Editor
npm install vue-quill-editor --save
- 下载quill(Vue-Quill-Editor需要依赖)
npm install quill --save
- 代码
<template> <div class="edit_container"> <quill-editor v-model="content" ref="myQuillEditor" :options="editorOption" @blur="onEditorBlur($event)" @focus="onEditorFocus($event)" @change="onEditorChange($event)"> </quill-editor> </div> </template> <script> import { quillEditor } from "vue-quill-editor"; //调用编辑器 import 'quill/dist/quill.core.css'; import 'quill/dist/quill.snow.css'; import 'quill/dist/quill.bubble.css'; export default { components: { quillEditor }, data() { return { content: `<p></p><p><br></p><ol><li><strong><em>Or drag/paste an image here.</em></strong></li><li><strong><em>rerew</em></strong></li><li><strong><em>rtrete</em></strong></li><li><strong><em>tytrytr</em></strong></li><li><strong><em>uytu</em></strong></li></ol>`, editorOption: {} } }, methods: { onEditorReady(editor) { // 准备编辑器 }, onEditorBlur(){}, // 失去焦点事件 onEditorFocus(){}, // 获得焦点事件 onEditorChange(){}, // 内容改变事件 }, computed: { editor() { return this.$refs.myQuillEditor.quill; }, } } </script>
OK,搞定,简洁的富文本编辑器就展现在你眼前了,另外附上API。Vue-Quill-Editor
-
自定义 toolbar 菜单
editorOption: { placeholder: "请在这里输入", modules:{ toolbar:[ ['bold', 'italic', 'underline', 'strike'], //加粗,斜体,下划线,删除线 ['blockquote', 'code-block'], //引用,代码块 [{ 'header': 1 }, { 'header': 2 }], // 标题,键值对的形式;1、2表示字体大小 [{ 'list': 'ordered'}, { 'list': 'bullet' }], //列表 [{ 'script': 'sub'}, { 'script': 'super' }], // 上下标 [{ 'indent': '-1'}, { 'indent': '+1' }], // 缩进 [{ 'direction': 'rtl' }], // 文本方向 [{ 'size': ['small', false, 'large', 'huge'] }], // 字体大小 [{ 'header': [1, 2, 3, 4, 5, 6, false] }], //几级标题 [{ 'color': [] }, { 'background': [] }], // 字体颜色,字体背景颜色 [{ 'font': [] }], //字体 [{ 'align': [] }], //对齐方式 ['clean'], //清除字体样式 ['image','video'] //上传图片、上传视频 ] } },
-
存储及将数据库中的数据反显为HTML字符串
后台接收到数据后会将字符中的标签进行转码,所以我们要先进行一个解码的操作让他变成标签形式的字符串:
例如后台接收的数据如下:"<h1>title<" ,对应解码后就是`<h1>title</h1>`。//把实体格式字符串转义成HTML格式的字符串 escapeStringHTML(str) { str = str.replace(/</g,'<'); str = str.replace(/>/g,'>'); return str; }
然后将返回值赋值给对应的参数:
<div v-html="str" class="ql-editor"> {{str}} </div>
上面的str就是转码函数返回的值,我们要先在data中定义,所以我现在将新增跟展示放在一起,代码如下:
<template> <div class="edit_container"> <!-- 新增时输入 --> <quill-editor v-model="content" ref="myQuillEditor" :options="editorOption" @blur="onEditorBlur($event)" @focus="onEditorFocus($event)" @change="onEditorChange($event)"> </quill-editor> <!-- 从数据库读取展示 --> <div v-html="str" class="ql-editor"> {{str}} </div> </div> </template> <script> import { quillEditor } from "vue-quill-editor"; //调用编辑器 import 'quill/dist/quill.core.css'; import 'quill/dist/quill.snow.css'; import 'quill/dist/quill.bubble.css'; export default { components: { quillEditor }, data() { return { content: `<p></p><p><br></p><ol><li><strong><em>Or drag/paste an image here.</em></strong></li><li><strong><em>rerew</em></strong></li><li><strong><em>rtrete</em></strong></li><li><strong><em>tytrytr</em></strong></li><li><strong><em>uytu</em></strong></li></ol>`, str: '', editorOption: {} } }, methods: { onEditorReady(editor) { // 准备编辑器 }, onEditorBlur(){}, // 失去焦点事件 onEditorFocus(){}, // 获得焦点事件 onEditorChange(){}, // 内容改变事件 // 转码 escapeStringHTML(str) { str = str.replace(/</g,'<'); str = str.replace(/>/g,'>'); return str; } }, computed: { editor() { return this.$refs.myQuillEditor.quill; }, }, mounted() { let content = ''; // 请求后台返回的内容字符串 this.str = this.escapeStringHTML(content); } } </script>
最后提醒大家一句,插件只兼容IE10以上,不能向下兼容,如果要向下兼容,只能放弃使用这个插件。
- 下载Vue-Quill-Editor
-
JAVA轻量级锁简介
2018-10-20 17:39:47轻量级锁能够提升程序同步性能的一句是“对于绝大部分的锁,在整个同步周期内都是不存在竞争的”,这是一个经验数据。 在 Java Object头文件中,有一个“Mark Word”对象,它是实现轻量级锁的关键。 Mark Word的数据...概念
在某些场景下,去获取对象锁的时候使用CAS的方式,而不是阻塞。
轻量级锁能够提升程序同步性能的一句是“对于绝大部分的锁,在整个同步周期内都是不存在竞争的”,这是一个经验数据。在 Java Object头文件中,有一个“Mark Word”对象,它是实现轻量级锁的关键。
Mark Word的数据结构非固定,根据不同的状态会有不同的结构。
比如在32位的HotSpot虚拟机中对象未被锁定的状态下,Mark Word的32bit空间中的25bit用于存储对象哈希码,4bit用于存储对象分代年龄,2bit用于存储锁标志位,1bit固定为0。
其主要的几个状态如下:状态 标志位 存储内容 未锁定 01 对象哈希码、对象分代年龄 轻量级锁定 00 指向锁记录的指针 重量级锁定 10 指向重量级锁的指针 GC标志 11 空,不需要记录信息 可偏向 01 偏向线程ID、偏向时间戳,对象分代年龄 轻量级锁加锁过程
(1)在代码进入同步块的时候,如果同步对象锁状态为无锁状态(锁标志位为“01”状态),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储旧的Mark Word的拷贝,官方称其为Displaced Mark Word。(锁记录解锁的时候会用到)
(2)虚拟机将使用CAS操作尝试将对象的Mark Word更新为轻量级锁的标志位和指向锁记录(Lock Record)的指针。
(3)如果这个更新动作成功了,那么这个线程就拥有了该对象的锁。
(4)如果这个更新操作失败了,虚拟机首先会检查当前线程是否已经拥有了这个对象的锁,如果已经拥有,那就可以直接进入同步块继续执行。否则就说明这个锁度一项已经被其他线程抢占了。一旦发生这种情况,那么轻量级锁就会膨胀为重量级锁。Mark Word中存储的就会指向重量级锁的指针,后面等待锁的线程也会进入阻塞状态。
轻量级锁解锁过程
(1)通过CAS操作尝试把线程中复制的Displaced Mark Word对象替换当前的Mark Word。
(2)如果替换成功,整个同步过程就完成了。
(3)如果替换失败,说明有其他线程尝试过获取该锁,并导致该锁变成了重量级锁,那就要在释放锁的同时,唤醒被挂起的线程。
画图理解
加锁
用New Mark Word替换Old Mark Word。
解锁
用Displaced Mark Word替换New Mark Word。
-
内核线程、轻量级进程、用户线程三种线程概念解惑(线程≠轻量级进程)
2016-05-23 15:29:22关于进程、线程和轻量级进程的一些笔记 [维基百科-轻量级进程]https://en.wikipedia.org/wiki/Light-weight_process#See_also 线程与进程概念在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; ...转载
[维基百科-轻量级进程]https://en.wikipedia.org/wiki/Light-weight_process#See_also
线程与进程概念
在现代操作系统中,进程支持多线程。
进程是资源管理的最小单元;
线程是程序执行的最小单元。
即线程作为调度和分配的基本单位,进程作为资源分配的基本单位
一个进程的组成实体可以分为两大部分:线程集和资源集。进程中的线程是动态的对象;代表了进程指令的执行。资源,包括地址空间、打开的文件、用户信息等等,由进程内的线程共享。
线程概念的产生
传统单线程进程的缺点
现实中有很多需要并发处理的任务,如数据库的服务器端、网络服务器、大容量计算等。
传统的UNIX进程是单线程的,单线程意味着程序必须是顺序执行,不能并发;既在一个时刻只能运行在一个处理器上,因此不能充分利用多处理器框架的计算机。
如果采用多进程的方法,则有如下问题:
- fork一个子进程的消耗是很大的,fork是一个昂贵的系统调用,即使使用现代的写时复制(copy-on-write)技术。
- 各个进程拥有自己独立的地址空间,进程间的协作需要复杂的IPC技术,如消息传递和共享内存等。
多线程的优缺点
多线程的优点和缺点实际上是对立统一的。
支持多线程的程序(进程)可以取得真正的并行(parallelism),且由于共享进程的代码和全局数据,故线程间的通信是方便的。它的缺点也是由于线程共享进程的地址空间,因此可能会导致竞争,因此对某一块有多个线程要访问的数据需要一些同步技术。
线程的设计过程演变
在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持SMP以及减小(进程/线程)上下文切换开销。
SMP机器上多线程的并行性
无论按照怎样的分法,一个进程至少需要一个线程作为它的指令执行体,进程管理着资源(比如cpu、内存、文件等等),而将线程分配到某个cpu上执 行。
一个进程当然可以拥有多个线程,此时,如果进程运行在SMP机器上,它就可以同时使用多个cpu来执行各个线程,达到最大程度的并行,以提高效率;同 时,即使是在单cpu的机器上,采用多线程模型来设计程序,正如当年采用多进程模型代替单进程模型一样,使设计更简洁、功能更完备,程序的执行效率也更 高,例如采用多个线程响应多个输入,而此时多线程模型所实现的功能实际上也可以用多进程模型来实现,而与后者相比,线程的上下文切换开销就比进程要小多 了,从语义上来说,同时响应多个输入这样的功能,实际上就是共享了除cpu以外的所有资源的。
线程模型–核心级线程和用户级线程
针对线程模型的两大意义,分别开发出了核心级线程和用户级线程两种线程模型,分类的标准主要是线程的调度者在核内还是在核外。前者更利于并发使用多处理器的资源,而后者则更多考虑的是上下文切换开销。
关于线程的实现模型,可以参见博主的另外一篇博客线程的3种实现方式–内核级线程, 用户级线程和混合型线程
目前的实现策略
在目前的商用系统中,通常都将两者结合起来使用,既提供核心线程以满足smp系统的需要,也支持用线 程库的方式在用户态实现另一套线程机制,此时一个核心线程同时成为多个用户态线程的调度者。
正如很多技术一样,”混合”通常都能带来更高的效率,但同时也 带来更大的实现难度,出于”简单”的设计思路,Linux从一开始就没有实现混合模型的计划,但它在实现上采用了另一种思路的”混合”。
在线程机制的具体实现上,可以在操作系统内核上实现线程,也可以在核外实现,后者显然要求核内至少实现了进程,而前者则一般要求在核内同时也支持进 程。核心级线程模型显然要求前者的支持,而用户级线程模型则不一定基于后者实现。这种差异,正如前所述,是两种分类方式的标准不同带来的。
当核内既支持进程也支持线程时,就可以实现线程-进程的”多对多”模型,即一个进程的某个线程由核内调度,而同时它也可以作为用户级线程池的调度 者,选择合适的用户级线程在其空间中运行。这就是前面提到的”混合”线程模型,既可满足多处理机系统的需要,也可以最大限度的减小调度开销。
绝大多数商业 操作系统(如Digital Unix、Solaris、Irix)都采用的这种能够完全实现POSIX1003.1c标准的线程模型。在核外实现的线程又可以分为”一对一”、”多对 一”两种模型,前者用一个核心进程(也许是轻量进程)对应一个线程,将线程调度等同于进程调度,交给核心完成,而后者则完全在核外实现多线程,调度也在用 户态完成。后者就是前面提到的单纯的用户级线程模型的实现方式,显然,这种核外的线程调度器实际上只需要完成线程运行栈的切换,调度开销非常小,但同时因 为核心信号(无论是同步的还是异步的)都是以进程为单位的,因而无法定位到线程,所以这种实现方式不能用于多处理器系统,而这个需求正变得越来越大,因 此,在现实中,纯用户级线程的实现,除算法研究目的以外,几乎已经消失了。
Linux内核只提供了轻量进程的支持,限制了更高效的线程模型的实现,但Linux着重优化了进程的调度开销,一定程度上也弥补了这一缺陷。目前 最流行的线程机制LinuxThreads所采用的就是线程-进程”一对一”模型,调度交给核心,而在用户级实现一个包括信号处理在内的线程管理机制。
三种线程概念——内核线程、轻量级进程、用户线程
内核线程
内核线程就是内核的分身,一个分身可以处理一件特定事情。这在处理异步事件如异步IO时特别有用。内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间。支持多线程的内核叫做多线程内核(Multi-Threads kernel )。
内核线程只运行在内核态,不受用户态上下文的拖累。
处理器竞争:可以在全系统范围内竞争处理器资源;
使用资源:唯一使用的资源是内核栈和上下文切换时保持寄存器的空间
调度:调度的开销可能和进程自身差不多昂贵
同步效率:资源的同步和数据共享比整个进程的数据同步和共享要低一些。
轻量级进程
轻量级进程(LWP)是建立在内核之上并由内核支持的用户线程,它是内核线程的高度抽象,每一个轻量级进程都与一个特定的内核线程关联。内核线程只能由内核管理并像普通进程一样被调度。
a LWP runs in user space on top of a single kernel thread and shares its address space and system resources with other LWPs within the same process
轻量级进程由clone()系统调用创建,参数是CLONE_VM,即与父进程是共享进程地址空间和系统资源。
与普通进程区别:LWP只有一个最小的执行上下文和调度程序所需的统计信息。
处理器竞争:因与特定内核线程关联,因此可以在全系统范围内竞争处理器资源
使用资源:与父进程共享进程地址空间
调度:像普通进程一样调度
轻量级线程(LWP)是一种由内核支持的用户线程。它是基于内核线程的高级抽象,因此只有先支持内核线程,才能有LWP。每一个进程有一个或多个LWPs,每个LWP由一个内核线程支持。这种模型实际上就是恐龙书上所提到的一对一线程模型。在这种实现的操作系统中,LWP就是用户线程。
由于每个LWP都与一个特定的内核线程关联,因此每个LWP都是一个独立的线程调度单元。即使有一个LWP在系统调用中阻塞,也不会影响整个进程的执行。
轻量级进程具有局限性。
首先,大多数LWP的操作,如建立、析构以及同步,都需要进行系统调用。系统调用的代价相对较高:需要在user mode和kernel mode中切换。
其次,每个LWP都需要有一个内核线程支持,因此LWP要消耗内核资源(内核线程的栈空间)。因此一个系统不能支持大量的LWP。
注:
- LWP的术语是借自于SVR4/MP和Solaris 2.x。
- 有些系统将LWP称为虚拟处理器。
- 将之称为轻量级进程的原因可能是:在内核线程的支持下,LWP是独立的调度单元,就像普通的进程一样。所以LWP的最大特点还是每个LWP都有一个内核线程支持。
用户线程
用户线程是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全又库函数在用户空间完成,不需要内核的帮助。因此这种线程是极其低消耗和高效的。
处理器竞争:单纯的用户线程是建立在用户空间,其对内核是透明的,因此其所属进程单独参与处理器的竞争,而进程的所有线程参与竞争该进程的资源。
使用资源:与所属进程共享进程地址空间和系统资源。
调度:由在用户空间实现的线程库,在所属进程内进行调度
LWP虽然本质上属于用户线程,但LWP线程库是建立在内核之上的,LWP的许多操作都要进行系统调用,因此效率不高。而这里的用户线程指的是完全建立在用户空间的线程库,用户线程的建立,同步,销毁,调度完全在用户空间完成,不需要内核的帮助。因此这种线程的操作是极其快速的且低消耗的。
上图是最初的一个用户线程模型,从中可以看出,进程中包含线程,用户线程在用户空间中实现,内核并没有直接对用户线程进程调度,内核的调度对象和传统进程一样,还是进程本身,内核并不知道用户线程的存在。
用户线程之间的调度由在用户空间实现的线程库实现。
这种模型对应着恐龙书中提到的多对一线程模型,其缺点是一个用户线程如果阻塞在系统调用中,则整个进程都将会阻塞。
加强版的用户线程——用户线程+LWP
这种模型对应着恐龙书中多对多模型。
用户线程库还是完全建立在用户空间中,因此用户线程的操作还是很廉价,因此可以建立任意多需要的用户线程。
操作系统提供了LWP作为用户线程和内核线程之间的桥梁。LWP还是和前面提到的一样,具有内核线程支持,是内核的调度单元,并且用户线程的系统调用要通过LWP,因此进程中某个用户线程的阻塞不会影响整个进程的执行。
用户线程库将建立的用户线程关联到LWP上,LWP与用户线程的数量不一定一致。当内核调度到某个LWP上时,此时与该LWP关联的用户线程就被执行。
Linux使用的线程库
LinuxThreads是用户空间的线程库,所采用的是线程-进程1对1模型(即一个用户线程对应一个轻量级进程,而一个轻量级进程对应一个特定的内核线程),将线程的调度等同于进程的调度,调度交由内核完成,而线程的创建、同步、销毁由核外线程库完成(LinuxThtreads已绑定到 GLIBC中发行)。
在LinuxThreads中,由专门的一个管理线程处理所有的线程管理工作。当进程第一次调用pthread_create()创建线程时就会先 创建(clone())并启动管理线程。后续进程pthread_create()创建线程时,都是管理线程作为pthread_create()的调用者的子线程,通过调用clone()来创建用户线程,并记录轻量级进程号和线程id的映射关系,因此,用户线程其实是管理线程的子线程。
LinuxThreads只支持调度范围为PTHREAD_SCOPE_SYSTEM的调度,默认的调度策略是SCHED_OTHER。
用户线程调度策略也可修改成SCHED_FIFO或SCHED_RR方式,这两种方式支持优先级为0-99,而SCHED_OTHER只支持0。SCHED_OTHER 分时调度策略,
SCHED_FIFO 实时调度策略,先到先服务
SCHED_RR 实时调度策略,时间片轮转
SCHED_OTHER是普通进程的,后两个是实时进程的(一般的进程都是普通进程,系统中出现实时进程的机会很少)。SCHED_FIFO、 SCHED_RR优先级高于所有SCHED_OTHER的进程,所以只要他们能够运行,在他们运行完之前,所有SCHED_OTHER的进程的都没有得到 执行的机会
小结:
很多文献中都认为轻量级进程就是线程,实际上这种说法并不完全正确,从前面的分析中可以看到,只有在用户线程完全由轻量级进程构成时,才可以说轻量级进程就是线程。
-
一种用于序列建模的轻量级递归网络
2020-08-04 08:59:51一种用于序列建模的轻量级递归网络 -
轻量级偏好数据库:开发指导
2020-11-13 17:16:30轻量级偏好数据库是轻量级存储,主要用于保存应用的一些常用配置,并不适合存储大量数据和频繁改变数据的场景。用户的数据保存在文件中,可以持久化的存储在设备上。需要注意的是用户访问的实例包含文件所有数据,并... -
轻量级神经网络
2018-10-15 17:36:58# 轻量级神经网络 MobileNet V1 paper:MobileNets Efficient Convolutional Neural Networks for Mobile Vision Applications link:MobileNet V1 核心点:将标准的卷积因式分解成为depthwise convolution 和 ... -
轻量级框架与重量级框架
2015-10-23 10:05:22轻量级框架一般由struts,spring组成,侧重于减小开发的复杂度,相应的它的处理能力便有所减弱(如事务功能弱、不具备分布式处理能力),比较适用于开发中小型企业应用 轻量级框架是相对于重量级框架的一种设计... -
轻量级模型:MobileNet V2
2018-08-05 15:48:57一、论文: ... ... ...MobileNet V2 是对 MobileNet V1 的改进,同样是一个轻量级卷积神经网络。 1)基础理论--深度可分离卷积(DepthWise操作) 标准的卷积过程可以看上图,一个2×2的卷积核在... -
Present 轻量级加密算法 C#实现
2017-10-20 16:30:29Present轻量级加密算法 Present:一种轻量级分组密码 我先用我粗糙的英语给大家翻译一下: 摘要:随着AES的建立,对新块的需求密码已大大减少;几乎所有的分组密码应用程序AES是一个优秀和... -
java轻量级后端应用服务器从零开始一步步搭建到上线运行(一) java 轻量级http服务器框架源码
2019-03-05 14:38:10java轻量级后端应用服务器从零开始一步步搭建到上线运行...这是一个轻量级服务器搭建的系列文章,各个功能模块都被分解,一章一章的整合进去,从简单到复杂,从简陋到完善,最终就是一个完整的java后台应用服务器项目.... -
轻量级深度学习网络概览
2019-01-17 17:23:30调研了一下最近的一些轻量级网络,列举并简单介绍各个网络的设计思路 PVANET 2016年1月在arxiv网站第一次提交 文章地址:https://arxiv.org/abs/1608.08021 代码链接:... -
轻量级框架自己对“轻”的理解
2019-01-31 15:16:11常常会听说这个是一个前端的轻量级框架、那个是后端的轻量级框架。 之前你是不是这样认为:比如说Vue.JS是一个轻量级的前端框架,在培训机构的老师是不是这样子教你:“学生们,大家来来看看这个vue.js的源文件是多... -
什么是轻量级框架,什么是重量级框架?
2019-02-28 13:28:11在项目初期定框架方案或者是寻思敏捷开发的时候,经常会看到轻量级、重量级等字眼,那么问题来了, 什么样的框架被叫做轻量级框架,什么样的是重量级框架呢? 1、我觉得最主要的衡量指标是以消耗的资源来决定。比如... -
轻量级标记语言--markdown
2020-04-09 12:09:14markdown是一种轻量级的标记语言,常常被用来写博客,在R语言中,通过rmarkdown写分析报告也是非常方便的,markdown可以被转为html,pdf,word格式文档。本文介绍markdown的一些基本语法。 标题 用n个# title号表示... -
轻量级框架与重量级框架的区分
2018-03-26 12:47:09一、轻量级框架与重量级框架并没有确却的定义,区分的时候主要从下面几个方面考虑:1、启动程序时需要加载的资源EJB应用启动时,需要消耗大量的资源,比如内存、CPU等,把所有的服务都加载进来;而Spring则是可定制... -
浅析轻量级锁
2018-03-19 15:51:30从轻量级锁 来看锁机制。(目前 上的唯一一张图。= =。 因为有些东西没有图的话 是很难理清楚的 - - )对象是否被某个线程的锁定的依据是, 对象头中记录的信息。 mark word 也叫对象标志词。对象头的信息内容是变化... -
轻量级Java EE企业应用实战(第3版) 代码
2012-04-19 23:26:08轻量级Java EE企业应用实战(第3版) 的所有源码(随书光盘中提出),因上传空间问题将所有jar包提出放在“libs”目录下,如果用哪个可以自己找一下。内有readme.txt自己看下。 急用的兄弟下吧! -
Java的EE框架的轻量级和重量级
2017-01-06 15:00:41轻量级框架和重量级框架解决问题的侧重点是不同的。一 轻量级框架轻量级框架侧重于减小开发的复杂度,相应的它的处理能力便有所减弱(如事务功能弱、不具备分布式处理能力),比较适用于开发中小型企业应用。采用轻量... -
java中重量级和轻量级的区别
2016-05-16 16:13:30首先轻量级与重量级是一个相对的概念,主要是对应用框架使用方便性和所提供服务特性等方面做比较的。 重量级的框架在耦合性方面要比轻量级的大一些,但是重量级框架提供的服务要比轻量级的多。 比方说EJB就是一... -
简述轻量级与重量级(框架,应用,组件)
2018-06-14 13:49:44简述轻量级与重量级(框架,应用,组件) 一、框架的轻量级与重量级 轻量级与重量级是一个相对的概念,主要是对应用框架使用方便性和所提供服务特性等方面做比较的。 比方说EJB就是一个重量级的框架,因为它对所... -
轻量级锁和偏向锁
2016-11-21 20:53:41JVM的两种改善机制——轻量级锁和偏向锁轻量级锁synchronized会在对象的头部打标记,这个加锁的动作是必须要做的,悲观锁通常还会做许多其他的指令动作,轻量级锁希望通过CAS实现,它认为通过CAS尝试修改对象头部的... -
mysql轻量级的管理工具
2018-12-01 16:37:17mysql轻量级的管理工具 最近用mysql老是发愁,为什么呢?? 因为很多调用mysql的工具都很大型,我想要个轻量级的。 在进过百度谷歌的各种搜索,发现一个在windows平台下非常好的mysql工具:HeidiSQL 官网: ... -
轻量级过程改进之综述
2014-10-21 07:13:44轻量级过程改进(Light-weight process improvement,LPI)是一种针对中小型团队软件研发过程中普遍存在的重技术轻管理、研发管理缺乏规范、过程改进理念淡薄等现状和问题而整理的一种“软件过程改进方法和规范”,... -
Oracle轻量级客户端使用
2018-10-27 00:24:13Oracle轻量级客户端,不需要安装,绿色版,可以用于本地或者远程数据库连接,包含了基本的sqlplus,数据泵等功能。 官方解释如下:... -
轻量级私有云解决方案
2019-02-14 15:05:58思询科技致力于成为领先的云计算解决方案供应商,所提供的轻量级私有云解决方案是一体化集中式云管理服务平台,已经形成涵盖IaaS、PaaS、SaaS三个层面整体解决方案服务能力,凭借高端服务器、海量存储、云管理平台、... -
什么是轻量级、重量级框架
2018-02-24 11:18:49划分一个应用是否属于轻量级还是重量级,不是说这个框架占了服务器多大的内存空间,这个框架就是重量级的框架,主要是看它使用了多少的服务,使用的服务越多,容器要为普通java对象做的工作就会越多。必然会影响到... -
看完这篇恍然大悟,理解Java中的偏向锁,轻量级锁,重量级锁
2020-04-11 16:54:42锁的状态总共有四种:无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁(但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级) -
FlashDB V1.0.0 正式版发布,轻量级嵌入式数据库
2020-10-15 13:58:33FlashDB 是一款超轻量级的嵌入式数据库,专注于提供嵌入式产品的数据存储方案。与传统的基于文件系统的数据库不同,FlashDB 结合了 Flash 的特性,具有较强的性能及可靠性。并在保证极低的资源占用前提下,尽可能...
-
Nested list and file.txt
-
MySQL 备份与恢复详解(高低版本 迁移;不同字符集 相互转换;表
-
BGLight.zip
-
自动化测试Python3+Selenium3+Unittest
-
Ruby On Rails路径遍历漏洞 CVE-2018-3760 漏洞复现
-
FTP 文件传输服务
-
IDEA常用快捷键汇总.docx
-
Http通信协议
-
【Zookeeper】集群模式:架构设计猜想
-
PowerBI重要外部工具详解
-
在 Linux 上构建企业级 DNS 域名解析服务
-
GC如何判断对象可以被回收
-
C语言零基础入门(详细讲解)
-
基于Hypervisor虚拟化技术的Hadoop云平台管理方案的研究.docx
-
SaaS产品项目实施流程
-
Mysql数据库面试直通车
-
PlantCARE_24263__plantCARE.tar.gz
-
SSH LINUX 免密码登录失败原因踩坑
-
MHA 高可用 MySQL 架构与 Altas 读写分离
-
计算机复试英语准备.pdf