当客户端登录完成后,会在服务端产生一个session,此时服务端会将sessionid返回给客户端浏览器。客户端将sessionid储存在浏览器的cookie中,当用户再次登录时,会获得对应的sessionid,然后将sessionid发送到服务端请求登录,服务端在内存中找到对应的sessionid,完成登录,如果找不到,返回登录页面。
synchronized 锁升级原理:在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获
(1)都是可重入锁; (2)ReentrantLock内部是实现了Sync,Sync继承于AQS抽象类。Sync有两个实现,一个是公平锁,一个是非公平锁,通过构造函数定义。AQS中维护了一个state来计算重入次数,避免频繁的持有释放操作带来的线程问题。 (3)ReentrantLock只能定义代码块,而Synchronized可以定义方法和代码块; 4、Synchronized是JVM的一个内部
Synchronized的并发策略是悲观的,不管是否产生竞争,任何数据的操作都必须加锁。 乐观锁的核心是CAS,CAS包括内存值、预期值、新值,只有当内存值等于预期值时,才会将内存值修改为新值。
(1)自旋锁 在线程进行阻塞的时候,先让线程自旋等待一段时间,可能这段时间其它线程已经解锁,这时就无需让线程再进行阻塞操作了。 自旋默认次数是10次。 (2)自适应自旋锁 自旋锁的升级,自旋的次数不再固定,由前一次自旋次数和锁的拥有者的状态决定。 (3)锁消除 在动态编译同步代码块的时候,JIT编译器借助逃逸分析技术来判断锁对象是否只被一个线程访问,而没有其他线程,这时就可以取消锁了。 4、锁粗化
(1)可重入性 synchronized的锁对象中有一个计数器(recursions变量)会记录线程获得几次锁; 可重入的好处: 可以避免死锁; 可以让我们更好的封装代码; synchronized是可重入锁,每部锁对象会有一个计数器记录线程获取几次锁,在执行完同步代码块时,计数器的数量会-1,直到计数器的数量为0,就释放这个锁。 (2)不可中断性 一个线程获得锁后,另一个线程想要获得锁,必须处于
HashSet实际上是一个HashMap实例,数据存储结构都是数组+链表。 HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value都是一个统一的对象PRESENT。 private static final Object PRESENT = new Object(); HashSet中add方法调用的是底层HashMap中的put方法,pu
可以使用符号表示数据库,并且可以将这些符号简化为表的集合。在数据库中,每个实体集或关系集都可以以表的形式表示。 ER图如下: 将ER图转换为表有一些要点: 实体类型成为一个表。在给定的ER图中,,,和形成单独的表。 所有单值属性都成为表的列。在实体中,和构成了表的列。 同样,和构成表的列,依此类推。 主键表示的实体类型的键属性。在给定的ER图中,,,和是实体的键属性。 多值属性由单独的表来表示。在
主要内容:1. 生产参数,2. 缩进空间,3. 分离空间,4. 忽略行前缀,5. 折叠线在本章中,将了解YAML中语法原语的以下几个方面 - 生产参数 缩进空间 分离空间 忽略的行前缀 折叠线 下面来详细地了解每个方面。 1. 生产参数 生产参数包括一组参数以及在特定生产中使用的允许值范围。 YAML中使用以下生产参数列表 - 缩进 它由字符或表示字符流取决于其中包含的块的缩进级别。 许多生产都参数化了这些功能。 上下文 它由表示,YAML支持两组上下文:块样式和流样式。 样式 它由
在深入学习Kafka之前,需要先了解topics, brokers, producers和consumers等几个主要术语。 下面说明了主要术语的详细描述和组件。 在上图中,主题(topic)被配置为三个分区。 分区1(Partition 1)具有两个偏移因子和。分区2(Partition 2)具有四个偏移因子,,和,分区3(Partition 3)具有一个偏移因子。replica 的id与托管它
主要内容:直接记录快照,而非差异比较,近乎所有操作都是本地执行,Git 保证完整性,Git 一般只添加数据,三种状态Git 究竟是怎样的一个系统呢? 请注意接下来的内容非常重要,若你理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余。 在开始学习 Git 的时候,请努力分清你对其它版本管理系统的已有认识,如 Subversion 和 Perforce 等;这么做能帮助你使用工具时避免发生混淆。 Git 在保存和对待各种信息的时候与其它版本控制系统有很大差异,尽管操作起来的命令形
主要内容:实例分布式锁是控制分布式系统之间同步访问共享资源的一种方式。 下面介绍 zookeeper 如何实现分布式锁,讲解排他锁和共享锁两类分布式锁。 排他锁 排他锁(Exclusive Locks),又被称为写锁或独占锁,如果事务T1对数据对象O1加上排他锁,那么整个加锁期间,只允许事务T1对O1进行读取和更新操作,其他任何事务都不能进行读或写。 定义锁: 实现方式: 利用 zookeeper 的同级节点的
zookeeper 的 leader 选举存在两个阶段,一个是服务器启动时 leader 选举,另一个是运行过程中 leader 服务器宕机。在分析选举原理前,先介绍几个重要的参数。 服务器 ID(myid):编号越大在选举算法中权重越大 事务 ID(zxid):值越大说明数据越新,权重越大 逻辑时钟(epoch-logicalclock):同一轮投票过程中的逻辑时钟值是相同的,每投完一次值会增加
主要内容:实例zookeeper 的 watcher 机制,可以分为四个过程: 客户端注册 watcher。 服务端处理 watcher。 服务端触发 watcher 事件。 客户端回调 watcher。 其中客户端注册 watcher 有三种方式,调用客户端 API 可以分别通过 getData、exists、getChildren 实现,利用前面章节创建的 maven 工程,新建 WatcherDemo 类
客户端与服务端之间的连接是基于 TCP 长连接,client 端连接 server 端默认的 2181 端口,也就是 session 会话。 从第一次连接建立开始,客户端开始会话的生命周期,客户端向服务端的ping包请求,每个会话都可以设置一个超时时间。 Session 的创建 sessionID: 会话ID,用来唯一标识一个会话,每次客户端创建会话的时候,zookeeper 都会为其分配一个全局