源码

ReentrantLock源码分析

血红的双手。 提交于 2020-01-19 22:57:30
概述 ReentrantLock是一个可重入的互斥锁,也被称为独占锁。它支持公平锁和非公平锁两种模式。 ReentrantLock的使用方法 下面看一个最初级的例子: public class Test { //默认内部采用非公平实现 ReentrantLock lock=new ReentrantLock(); public void myMethor(){ lock.lock(); //需要加锁的一些操作 //一定要确保unlock能被执行到,尤其是在存在异常的情况下 lock.unlock(); } } 在进入方法后,在需要加锁的一些操作执行之前需要调用lock方法,在jdk文档中对lock方法详细解释如下: 获得锁。 如果锁没有被另一个线程占用并且立即返回,则将锁定计数设置为1。 如果当前线程已经保持锁定,则保持计数增加1,该方法立即返回。 如果锁被另一个线程保持,则当前线程将被禁用以进行线程调度,并且在锁定已被获取之前处于休眠状态,此时锁定保持计数被设置为1。 这里也很好的解释了什么是可重入锁,如果一个线程已经持有了锁,它再次请求获取自己已经拿到的锁,是能够获取成功的,这就是可重入锁。 在需要加锁的代码执行完毕之后,就会调用unlock释放掉锁。在jdk文档之中对,unlock的解释如下: 尝试释放此锁。 如果当前线程是该锁的持有者,则保持计数递减。 如果保持计数现在为零

线程池ThreadPoolExecutor源码分析(一)

牧云@^-^@ 提交于 2020-01-19 21:19:53
1、线程池简介 1.1 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。 1.2 线程池的工作机制 在线程池的编程模式下,任务是提交给整个线程池,而不是直接提交给某个线程,线程池在拿到任务后,就在内部寻找是否有空闲的线程,如果有,则将任务交给某个空闲的线程。 一个线程同时只能执行一个任务,但可以同时向一个线程池提交多个任务。 1.3 使用线程池的好处 Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处: 第一:降低资源消耗 。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度 。当任务到达时,任务可以不需要等到线程创建就能立即执行。 第三:提高线程的可管理性 。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用线程池,必须对其实现原理了如指掌。 2、JDK对线程池的支持 JDK提供了Executor框架,可以让我们有效的管理和控制我们的线程

鼠标 hook 源码 C#版

和自甴很熟 提交于 2020-01-19 21:15:17
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; namespace MouseHook20200119 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } #region 所需 public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam); //整数14表示全局钩子类型,其他类型对应的数字可以从MicrosoftSDK中的Winuser.h头文件中查看 public const int WH_MOUSE = 14; [DllImport("user32.dll")] public static extern int SetWindowsHookEx(int idHook, HookProc lpfn,

微软开源软件特征源码分析工具 Application Inspector

女生的网名这么多〃 提交于 2020-01-19 20:30:51
微软近日开源了其内部使用的软件特征源码分析工具 Application Inspector。 现代软件开发实践通常需要基于数百个现有组件中构建应用,无论它们是由组织中的另一个团队、外部供应商还是开源社区中的某个人编写的。这样虽然会带来许多好处,比如加快开发进度、软件质量与互操作性等,但同时也会带来隐藏的复杂性和风险。 应对这种情况,微软介绍其内部使用的工具是 Application Inspector,这是一个软件特征源码分析器,可以通过使用静态分析和可自定义的基于 json 的规则引擎来识别软件源码特征,了解程序的功能。 此工具与传统的静态分析工具的不同之处在于,它不会尝试识别“好”或“坏”的模式,而是会根据 500 多种规则模式报告发现的内容,并进行特征检测,包括影响安全性的特征,例如加密技术的使用等。 在以下示例中,Application Inspector 将识别出以下功能: FileOperation.Write Network.Connection.Http Process.DynamicExecution 这些功能可以告诉我们很多程序的相关信息。 Application Inspector 包含一个可过滤的置信度指示器,可帮助最大程度减少误报匹配以及可自定义的默认规则和条件匹配逻辑,其带有数百种功能检测模式,涵盖了许多流行的编程语言

Ubuntu16.04 从源码安装并升级python版本为3.6

社会主义新天地 提交于 2020-01-19 17:46:27
1. 下载python3.6源码包 wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz 2. 解压并开始安装 tar -xvf Python-3.6.5.tgz cd Python-3.6.5/ ./configure make && make install 3. 替换python3为python3.6 update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1 update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.6 2 update-alternatives --config python3 4. 解决pip3安装问题 替换版本之后 pip3 install 时会提示错误 subprocess.CalledProcessError: Command 'lsb_release -a' returned non-zero exit status 1. , 重点关注 lsb_release.py 这个模块 我们将python3.5中的 lsb_release.py 复制到python3.6中 root@ubuntu:~#

Idea编译Spring源码总结

风流意气都作罢 提交于 2020-01-19 17:40:04
前言:最近准备分享Spring源码相关,看源码的时候感觉打断点会更清晰一些。所以首先整理关于Idea编译Spring步骤及问题解决。希望大家通过本篇小文顺利搭建编译环境,与我一起踏上Spring源码分析之旅! 一、前期运行环境与工具准备 JDK版本:1.8.0_131 (JDK需要1.8以上) http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151. html Gradel版本:4.4.1 https://gradle.org/releases/ 配置教程:https://www.cnblogs.com/linkstar/p/7899191.html Spring源码版本:v5.0.7.RELEASE https://github.com/spring-projects/spring-framework/releases IntelliJ IDEA版本: IntelliJ IDEA 2019.1.3 或 2018.3.6(Ultimate Edition)下载地址:https://www.jetbrains.com/idea/download/ 第一部分中JDK、gradel环境变量配置自行配置,本文不作讲解。 二、官网下载spring源码

spring源码解析之SpringIOC源码解析(上)

主宰稳场 提交于 2020-01-19 17:34:08
SpringIOC源码解析(上) 一、什么是SpringIOC spring ioc指的是控制反转,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。交由Spring容器统一进行管理,从而实现松耦合。 二、SpringIOC源码解析 在开始之前我们先通过一个简单的示意图来了解一下大概的一个流程 从示意图可以看出,当web容器启动的时候,spring的全局bean的管理器会去xml配置文件中扫描的包下面获取到所有的类,并根据你使用的注解,进行对应的封装,封装到全局的bean容器中进行管理,一旦容器初始化完毕,beanID以及bean实例化的类对象信息就全部存在了,现在我们需要在某个service里面调用另一个bean的某个方法的时候,我们只需要依赖注入进来另一个bean的Id即可,调用的时候,spring会去初始化完成的bean容器中获取即可,如果存在就把依赖的bean的类的实例化对象返回给你,你就可以调用依赖的bean的相关方法或属性等; 本文会分析Spring的IOC模块的整体流程,分析过程需要使用一个简单的demo工程来启动Spring,需要的童鞋可自行下载 https://github.com/cjinjun/spring-framework-demo 工程示例代码 写一个简单的接口和接口实现类 public interface IOCService {

Jenkins源码管理git报错:Host key verification failed

只谈情不闲聊 提交于 2020-01-19 16:48:29
首先进入jenkins账号,直接sudo su jenkins还不行,看cat /etc/passwd 是把shell禁了的 sudo su - s / bin / bash jenkins 执行命令: git ls - remote - h git@ip : xxx . git HEAD 然后下一步 ,点击yes ,ok 来源: CSDN 作者: tianyaopen 链接: https://blog.csdn.net/tianyaopen/article/details/104039857

ConcurrentHashMap源码详解(与HashMap/HashTable的比较)

前提是你 提交于 2020-01-19 09:33:00
先看看速度比HashTable快又比HashMap线程安全的------当红明星ConcurrentHashMap具体使用方法: 非常的平淡无奇,跟HashMap和HashTable好像是一样东西。 但是,ConcurrentHashMap其实是融合了HashMap/HashTable这两种Hash表数据结构的优点。我们看源码可以知道: HashTable全部操作方法都是用Java 中自带的synchronized锁强制做同步达到线程安全的,不管是get还是put还是其他一些方法。 而HashMap就没考虑那么多,它的方法中全部没做线程安全锁处理。具体详细的HashMap介绍请看另外一篇博文: https://blog.csdn.net/whiteBearClimb/article/details/103946465 因此我们可以得出结论就是HashMap速度快但是线程不安全;HashTable速度慢但是线程安全。 ConcurrentHashMap就是融合它们二者各自的优点。既是线程安全的,速度又相对能较快。那么是怎么实现的呢?看源码: 继续进去ConcurrentMap看看什么个东西 这些毫无疑问没啥好讲的,我们再看看它最常用的几个方法有什么不同点。 Get方法: Put方法: 这里如果有仔细看过HashMap代码的人瞬间就恍然大悟了,没看过的打开:::https://blog

杂谈篇之我是怎么读源码的,授之以渔

自古美人都是妖i 提交于 2020-01-19 06:52:30
转自: https://www.cnblogs.com/youzhibing/p/9553752.html 以下为原文。 读源码的经历   刚参加工作那会,没想过去读源码,更没想过去改框架的源码;总想着别人的框架应该是完美的、万能的,应该不需要改;另外即使我改了源码,怎么样让我的改动生效了? 项目中引用的不还是没改的jar包吗。回想起来觉得那时候的想法确实挺......   工作了一年多之后准备跳槽了,开始了一轮的面试,其中有几个面试官就问到了相关的源码问题:ArrayList、HashMap的底层实现,spring、mybatis的相关源码。问源码的面试一般就是回去等消息,然后就没然后了。那时候开始意识到,源码这东西在之前的工作的中感受不到,但是在面试中好像面的还挺频繁的,从此有意识的开始了jdk部分源码的阅读(主要是集合)。一开始看源码,看的特别糙,知道个大概,知道ArrayList的底层实现是数组,HashMap的底层是散列表(数组+链表);更深入一点的扩容、hash碰撞等等就不知道了。   读spring源码起于工作中遇到了一个问题( spring jdbcTemplate事务,各种诡异,包你醍醐灌顶! ),排查一段时间最终是解决了,但过程让我非常难受,各种上网查资料、各种尝试,感觉就像大海捞针一样,遥遥无期。我下定决心,我要看一看spring的源码,于是我买了一本