轻量级

java中锁的四种状态

淺唱寂寞╮ 提交于 2019-12-01 11:09:43
文章目录 前言 叙述 Synchronized volatile 锁的状态 锁是存在哪里的呢? 四种状态 锁状态转换过程 锁的优缺点 参考文章 小结 前言 在多线程并发编程中Synchronized一直是元老级角色,很多人都会称它为重量级锁,但是随着 Java SE1.6 对 Synchronized 进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了 Java SE1.6 中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。 叙述 首先我们以一张思维导图大概的了解一下锁状态,接下来将进行具体的阐述。 Synchronized synchronized,所谓的重量级锁。Java中每一个对象都可以作为一个锁,表现为: 对于普通方法的同步,锁是当前实例对象。 对于静态方法的同步,锁是当前类的Class对象。 对于同步方法块,锁是Synchronized括号里配置的对象。 JVM基于进入和退出Monitor对象来实现方法同步和代码同步。方法同步是使用monitorenter和monitorexit指令实现的,monitorenter指令是在编译后插入到同步代码块开始的位置,monitorexit是插在方法结束处和异常处。 volatile volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的可见性

Java并发优化思路

夙愿已清 提交于 2019-12-01 11:07:46
一、并发优化 1.1、Java高并发包所采用的几个机制 (1)、CAS(乐观操作) jdk5以前采用synchronized,对共享区域进行同步操作, synchronized是重的操作,在高并发情况下,会引起线程频繁切换 ;而 CAS是一种乐观锁机制,compare and swap,不加锁 ,而是假设没有冲突去完成,若有冲突会重试(非阻塞)。compare&swap是原子操作,基于CPU的原语操作。 CAS仍然存在 三大问题:ABA问题,循环时间长开销大,以及只能保证一个共享变量的原子操作 。 (2)、Volatile(变量的可见性) VM阻止volatile变量的值放入处理器的寄存器 ,在写入值以后会被从处理器的cache中flush掉,写到内存中去,这样其他线程都可以立刻看到该变量的变化。 (3)、AQS,抽象队列同步器(原子性操作状态同步位、有序队列、阻塞唤醒进程) 获取锁:首先判断当前状态是否允许获取锁,如果是就获取锁,否则就阻塞操作或者获取失败,也就是说如果是独占锁就可能阻塞,如果是共享锁就可能失败。另外如果是阻塞线程,那么线程就需要进入阻塞队列。当状态位允许获取锁时就修改状态,并且如果进了队列就从队列中移除。 释放锁:这个过程就是修改状态位,如果有线程因为状态位阻塞的话就唤醒队列中的一个或者更多线程。 1.2、锁优化 今天所说的锁优化,是指在阻塞式的情况下

Java并发:线程安全与锁优化

时间秒杀一切 提交于 2019-12-01 11:07:08
概述 人们很难想象现实中的对象在一项工作进行期间,会被不停地中断和切换,对象的属性(数据)可能会在中断期间被修改和变“脏”,而这些事情在计算机世界中则是很正常的事情。有时候,良好的设计原则不得不向现实做出一些让步,我们必须让程序在计算机中正确无误地运行,然后再考虑如何将代码组织得更好,让程序运行更快。对于“高效并发”来说,首先需要保证并发的正确性,然后在此基础上实现高效。 1.线程安全 《Java Concurrency In Practice》的作者Brian Goetz对“线程安全”有一个比较恰当的定义:“当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的”。 这个定义比较严谨,它要求线程安全的代码都必须具备一个特征:代码本身封装了所有必要的正确性保障手段(如互斥同步等),令调用者无须关心多线程的问题,更无须自己采取任何措施来保证多线程的正确调用。这点听起来简单,但其实并不容易做到,在大多数场景中,我们都会将这个定义弱化一些,如果把“调用这个对象的行为”限定为“单次调用”,这个定义的其他描述也能够成立的话,我们就可以称它是线程安全了。 1.1 Java语言中的线程安全 按照线程安全的“安全程度”由强至弱来排序

超轻量级纯文本界面 REPL 类语言 IDE

折月煮酒 提交于 2019-12-01 10:21:25
超轻量级纯文本界面 REPL 类语言 IDE 目录 介绍 特性 实现原理 安装插件 配置方法 使用说明 其他信息 介绍 这是基于 Vim + Tmux 快速定制的一个针对 REPL 类编程语言的超轻量级开发环境, 不需要任何 GUI , 运行于纯粹的文本界面, 所以响应速度很快, 而且对于系统的要求很低, 在一些内存有限的旧电脑上也可以流畅地运行. 原本的目标是搭建一个可以流畅运行于 Raspberry Pi 2 的超轻量级 Common Lisp 调试开发环境, 用户可以通过 SSH 登录到树莓派上进行不受限制的开发, 最大限度地利用树莓派的硬件计算能力, 而不需要启动任何类型的 视窗 . 后来发现本集成环境可以支持任何一种拥有 REPL 机制的编程语言, 如 Clojure , Racket , Schema 以及 Lua 等多种语言. 环境需求: 需要安装好 vim 和 tmux . 技能要求: 需要使用者熟悉基本的 vi 操作, 熟悉一般的 tmux 操作. 本项目git.oschina.net仓库 特性 优点: 方便 超轻量级 高度可定制 响应速度最快 使用超级流畅 支持结对编程 运行资源需求最少 可运行于内存有限的旧电脑 全平台支持:Linux|Win32|OSX 支持任意拥有命令行 REPL 机制的语言 支持快捷键从代码编辑区发送代码到REPL区进行调试 缺点: 跟

内核线程、轻量级进程、用户线程三种线程概念解惑(线程≠轻量级进程)

谁说我不能喝 提交于 2019-12-01 05:00:07
线程与进程概念 在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; 线程是程序执行的最小单元。 即线程作为调度和分配的基本单位,进程作为资源分配的基本单位 一个进程的组成实体可以分为两大部分:线程集和资源集。进程中的线程是动态的对象;代表了进程指令的执行。资源,包括地址空间、打开的文件、用户信息等等,由进程内的线程共享。 线程概念的产生 传统单线程进程的缺点 现实中有很多需要并发处理的任务,如数据库的服务器端、网络服务器、大容量计算等。 传统的UNIX进程是单线程的,单线程意味着程序必须是顺序执行,不能并发;既在一个时刻只能运行在一个处理器上,因此不能充分利用多处理器框架的计算机。 如果采用多进程的方法,则有如下问题: fork一个子进程的消耗是很大的,fork是一个昂贵的系统调用,即使使用现代的写时复制(copy-on-write)技术。 各个进程拥有自己独立的地址空间,进程间的协作需要复杂的IPC技术,如消息传递和共享内存等。 多线程的优缺点 多线程的优点和缺点实际上是对立统一的。 支持多线程的程序(进程)可以取得真正的并行(parallelism),且由于共享进程的代码和全局数据,故线程间的通信是方便的。它的缺点也是由于线程共享进程的地址空间,因此可能会导致竞争,因此对某一块有多个线程要访问的数据需要一些同步技术。 线程的设计过程演变 在操作系统设计上

轻量级框架和重量级框架

萝らか妹 提交于 2019-12-01 04:30:32
轻量级框架和重量级框架 一、轻量级框架与重量级框架并没有确却的定义,区分的时候主要从下面几个方面考虑: 1、启动程序时需要加载的资源 EJB应用启动时,需要消耗大量的资源,比如内存、CPU等,把所有的服务都加载进来;而Spring则是可定制服务,需要加载什么就加载什么。 2、框架的侵入性程度或者框架的依赖性,耦合性程度(轻量级的框架侵入性程度较低) ● 轻量级框架不一定需要继承和实现框架的 接口 和 抽象类 来注册和实例化组件。 ● 重量级框架需要继承和实现框架的类或者实现框架的接口 ,以方便使用框架中间件特性。这就意味着,需要实例化大量的类并且注册到应用中去,虽然可能用不到。 3、轻量级框架一般是一组独立的特性实现集, 重量级框架往往依赖于 某些或其他类型的容器 支持框架的特性。 4、开发的方便程度 ● 轻量级框架在开发中应用非常简单方便 ● 重量级框架开发时则要写一些 框架绑定的类 , 部署、运行及测试过程 都较为 复杂 ,开发起来并不方便。 5、解决问题的侧重点 ● 轻量级框架侧重于 减小开发的复杂度 ,相应它的 处理能力较弱 (事务功能弱,不具备分布式处理能力),适用于开发中小型企业应用。 ● 重量级框架则强调高可伸缩性,适合于开发大型企业应用。 来源: https://www.cnblogs.com/lmh1008/p/11654030.html

从0开始学架构

▼魔方 西西 提交于 2019-11-30 19:43:43
微服务架构实战160讲 其它学习课程目录: 从0开始学微服务 面试官绝杀:系统是如何支撑高并发的? 分布式技术原理与算法解析 消息队列高手课 从0开始学架构 微服务 一种架构模式,提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(RESTful API)。每个服务都围绕着具体的业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。 结构图: 来源: https://www.cnblogs.com/it-chen/p/11637928.html

springmvc-初次接触

痴心易碎 提交于 2019-11-30 19:39:23
一,mvc做的事情   1,将url映射到java类或者java的方法。   2,封装用户提交的数据   3,处理请求--调用相关的业务处理--封装想相应的数据   4,将相应数据进行渲染,jsp或者html 二,spring mvc是一个轻量级的,基于请求响应的mvc框架。 三,为什么要学mvc   1,性能比struts2好,开发效率高,性能不高   2,简单,便捷,开发简单   3,天生和spring无缝集成,核心功能(ioc和aop)   4,使用约定优于配置, 来源: https://www.cnblogs.com/xiaozhang666/p/11637804.html

[开源] gnet: 一个轻量级且高性能的 Golang 网络库

戏子无情 提交于 2019-11-30 14:58:37
Github 主页 https://github.com/panjf2000/gnet 欢迎大家围观~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦。 简介 gnet 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络库。这个库直接使用 epoll 和 kqueue 系统调用而非标准 Golang 网络包: net 来构建网络应用,它的工作原理类似于两个开源的网络库: libuv 和 libevent 。 这个项目存在的价值是提供一个在网络包处理方面能和 Redis 、 Haproxy 这两个项目具有相近性能的Go 语言网络服务器框架。 gnet 的亮点在于它是一个高性能、轻量级、非阻塞的纯 Go 实现的传输层(TCP/UDP/Unix-Socket)网络库,开发者可以使用 gnet 来实现自己的应用层网络协议,从而构建出自己的应用层网络应用:比如在 gnet 上实现 HTTP 协议就可以创建出一个 HTTP 服务器 或者 Web 开发框架,实现 Redis 协议就可以创建出自己的 Redis 服务器等等。 gnet 衍生自另一个项目: evio ,但是性能更好。 功能 高性能 的基于多线程模型的 Event-Loop 事件驱动 内置 Round-Robin 轮询负载均衡算法 简洁的 APIs 基于 Ring-Buffer 的高效内存利用

开箱即用简单便捷的轻量级开源开发框架

给你一囗甜甜゛ 提交于 2019-11-30 12:28:31
  你是不是羡慕Java SpringBoot里功能强大的@注解功能,Spring Boot倡导是一种开箱即用、方便快捷、约定优于配置的开发流程,虽然现在.NET Core也往相同的方向走,但在使用上总有点别扭,目前市面上貌似还没有轻量级的真正意义上的开箱即用的基于.NET Core的框架。   想想多年前自己开发基于配置的DevFx开发框架,因为需要配置,造成开发人员苦不堪言,而且还容易配置错误,导致各种奇怪的错误;于是便有全新重写DevFx框架的想法,经过N个月的奋战,终于可以放出来用了。   框架不求功能全面,只求使用方便、灵活。   目前框架提供基于Attribute的IoC DI容器,完全可以面向接口编程了;提供轻量级的业务参数配置方案,未来计划作为集中配置的基础;提供极简但不失灵活的数据访问框架,类似mybatis基于sql的数据访问;还有基于HTTP/JSON的远程调用方案(以优雅的本地调用方式来远程调用);主要是以上几个功能。   框架是基于.NET Standard 2.0开发,理论上.NET Framework 4.6.1也能使用,因为框架已完全重新重写了,命名空间啥的都有改变,所以不兼容之前的版本,目前版本是5.0.2。   OK,show me the code。下面让我们来快速入门,看看怎么个开箱即用。 打开VS2019,建立基于.NET Core 2