文档章节

从classloader的变更说起

xpbob
 xpbob
发布于 01/13 10:03
字数 1008
阅读 22
收藏 2

classloader从1.6到1.7整体分成了两个版本。重点区别就是并行类加载。

1.6版本

    protected synchronized Class loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
		……
        return c;
    }

1.6版本加了一个方法锁。

1.7版本

  private final ConcurrentHashMap parallelLockMap;
  
    protected Class loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
	        ……
            return c;
        }
    }

    protected Object getClassLoadingLock(String className) {
        Object lock = this;
        if (parallelLockMap != null) {
            Object newLock = new Object();
            lock = parallelLockMap.putIfAbsent(className, newLock);
            if (lock == null) {
                lock = newLock;
            }
        }
        return lock;
    }

1.7之后就是用了两种模式getClassLoadingLock方法中,我们可以看出有两种模式,一种是parallelLockMap为空,锁的对象是classloader本身,另外一种是parallelLockMap不为null。这里会根据classname去获取锁,如果有返回的object不为null。说明已经有class使用过了,如果为null,就把新建的object当做锁,达到了一个classname一个锁的效果。

classloader加锁的原因

有很多classloader的例子直接复写了loadClass但是没有加锁,只有读取文件加载的过程,这种classloader都是特定场合使用的。并不具备通用性。众所周知的一个规则,一个classloader不能加载相同类的字节码,第二次加载就会在defineclass的时候报错。
场景1
不同的线程可以是相同的classloader,两个线程的都是A classloader加载的,当里面的有个方法里都有B类时,两个线程都会触发A加载B类
场景2
双亲委托的情况,A loader是B loader的parent。A能加载到C类。B loader加载c的时候委托给A,A也在同时加载C。此时触发了两次A加载C。

锁分离的好处

锁分离加快了并发,这个是显而易见的。还有一个好处是减少了死锁。在编写javaagent的时候,只要在transform加点锁,特别容易和classloader还有类初始化时候的锁造成死锁。基本死锁的场景都在1.6。

锁分离的案例

jdk中锁分离的实现特别多

读写分离

双锁读写分离
LinkedBlockingQueue有两把锁takeLock和putLock。 由于队列的特性——FIFO。在写入的时候,竞争takeLock。读取的时候竞争putLock。以此达到同事读写的增加吞吐量的目的。
副本机制读写分离
副本机制读写分离的典型就是copyonwrite。 CopyOnWriteArrayList。只有一把lock。但是使用的是数组存储。用volatile修饰。写入的时候获取锁,先用一个新的数组把旧的数据拷贝过来,然后把要加入的数据放入新数组中。最后替换 volatile的引用。读取的时候就直接获取volatile的数组。 这样读取的时候只是那一刻的副本,一旦开始遍历,直到结束都不会有新的数据加入了。

写写分离

写写分离的场景是锁细化。classloader的改进算是写写分离的情况。典型的场景就是ConcurrentHashMap。ConcurrentHashMap的每个槽位一把锁,当没有hash冲突的时候,元素的写的过程是并行的。

集群锁分离

集群的锁分离的场景我们也用到的特别多。主要目的是提供并发。

  1. kafka 消费(读写分离)。kafka写log,达到一定限制就会开启新的文件,消费的时候,从旧的开始,就会从已经写好的开始读取。这种情况下,读文和写的文件是两个不同的文件。
  2. kafka topic分区。(写写分离)。kafka写入根据分区算法。分别写入不同的partition。类似的还有分库,分表。只要是水平扩展的基本都是写写分离的。
  3. 主从机制(副本机制读写分离)。数据库使用主备方案,并且备份库只提供读取操作。至于新入的数据的空缺,一般由redis等缓存弥补。

© 著作权归作者所有

上一篇: CountDownLatch详解
下一篇: 消失的线程
xpbob

xpbob

粉丝 98
博文 98
码字总数 80029
作品 0
高级程序员
私信 提问
Tinker 1.9.9 发布,微信开源的 Android 热修复框架

Tinker 1.9.9 发布了,Tinker 是腾讯开源的 Android 热解决方案库,它支持在不重新安装 apk 的情况下对 dex、library 和 resources 进行更新。 1.9.9 更新内容 Bugfix 彻底隔离了Application...

局长
2018/09/28
688
0
Android解析ClassLoader(二)Android中的ClassLoader

相关文章 Java虚拟机系列 Android系统启动系列 Android解析ClassLoader系列 前言 在上一篇文章我们学习了Java的ClassLoader,很多同学会把Java和Android的ClassLoader搞混,甚至会认为Andro...

刘望舒
2017/10/18
0
0
Jodd 3.6.1 发布,Java 常用工具包

Jodd 是一个开源的 Java 工具集, 包含一些实用的工具类和小型框架。简单,却很强大! Jodd = Tools + IoC + MVC + DB + AOP + TX + JSON + HTML < 1.5 Mb [2014-10-01] 3.6.1 更新日志 [修复...

zqq90
2014/10/02
2.7K
10
Sentinel v1.4.2 发布,更好用的集群限流功能

Sentinel 发布 v1.4.2 正式发布,该版本主要变更如下: 特性/功能改进 新增 Zuul 1.x 适配模块(sentinel-zuul-adapter),结合集群限流特性可以更好地在 API Gateway 发挥流控的作用 热点参...

阿里巴巴中间件
02/21
0
0
更好用的集群限流功能,Sentinel 发布 v1.4.2

Sentinel 发布 v1.4.2 正式发布,该版本主要变更如下: 特性/功能改进 新增 Zuul 1.x 适配模块(sentinel-zuul-adapter),结合集群限流特性可以更好地在 API Gateway 发挥流控的作用 热点参...

中间件小哥
02/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 请务必让我分担他们的痛苦!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @clouddyy :分享石元丈晴的单曲《Why》: 《Why》- 石元丈晴 手机党少年们想听歌,请使劲儿戳(这里) @一代码哥 :当他妈狗屁的程序员,天天...

小小编辑
21分钟前
47
2
php 遇到 No input file specified的解决方法

(一)IIS Noinput file specified 方法一:改PHP.ini中的doc_root行,打开ini文件注释掉此行,然后重启IIS 方法二: 请修改php.ini 找到 ; cgi.force_redirect = 1 去掉前面分号,把后面的1...

chenhongjiang
今天
7
0
MySQL 基础

一、常用命令 在命令行中,配置好环境变量后,通过cmd可以直接进入mysql命令行模式,同时列举几种常用命令 # 进入mysql数据库,密码可以先不写,打完-p后再输入,防止被别人看到mysql -u账...

华山猛男
今天
6
0
简单的博客系统(四)Django请求HTML页面视图信息--基于函数的视图

1. 编写用于查询数据的功能函数 应用目录 下的 views.py 文件通常用于保存响应各种请求的函数或类 from django.shortcuts import renderfrom .models import BlogArticles# Create your ...

ZeroBit
今天
5
0
用脚本将本地照片库批量导入到Day One中

因为目前iCloud 空间已经不足,其中95%都是照片,之前入手了DayOne,且空间没有限制,订阅费一年也不少,再加上DayOne作为一款日记App 也比较有名,功能方面最大的就是地理视图与照片视图,尤...

在山的那边
昨天
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部