<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[dalangzhonghangxing的专栏]]></title><description><![CDATA[学习，分享。]]></description><link>https://blog.youkuaiyun.com/dalangzhonghangxing</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; dalangzhonghangxing]]></copyright><item><title><![CDATA[ThreadPoolExecutor源码解析]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/81131592</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/81131592</guid><author>dalangzhonghangxing</author><pubDate>Fri, 20 Jul 2018 14:26:02 +0800</pubDate><description><![CDATA[概述



Core and maximum pool sizes

当有新的task通过execute方法提交。 
1. 如果目前线程数 &amp;lt; corePoolSize，不论是否有空闲线程，这时都会创建一个新的线程来执行这个任务。 
2. 如果corePoolSize &amp;lt; 目前线程数 &amp;lt; maximumPoolSize，只有当队列满了之后才会创建新线程



Creating n...]]></description><category></category></item><item><title><![CDATA[Semaphore源码解析]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80878015</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80878015</guid><author>dalangzhonghangxing</author><pubDate>Sun, 01 Jul 2018 21:57:11 +0800</pubDate><description><![CDATA[Semaphore的实现主要依赖AbstractQueuedSynchronized，它实现了AQS的共享锁方案，即实现了tryAcquireShared与tryReleaseShared这两个方法。


Sync，继承自AbstractQueuedSynchronized，实现了非公平的tryAcquireShared方法与tryReleaseShared。

abstract static c...]]></description><category></category></item><item><title><![CDATA[深入ReentrantLock源码解析]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80877670</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80877670</guid><author>dalangzhonghangxing</author><pubDate>Sun, 01 Jul 2018 21:21:59 +0800</pubDate><description><![CDATA[ReentrantLock是基于AQS实现的，它提供了公平锁与非公平锁两种策略，当然这两种策略都是抢占式的。其核心代码是对AQS的公平、非公平的实现，下面我们来看其核心代码：


内部类Sync，该类定义为抽象类，并继承自AbstractQueuedSynchronizer，它还会被NonfairSync(非公平策略)与FairSync(公平策略)两个类继承。主要关注nonfairTryAcqui...]]></description><category></category></item><item><title><![CDATA[在竞争激烈的情况下，ReentrantLock与CAS的性能比较]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80873151</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80873151</guid><author>dalangzhonghangxing</author><pubDate>Sun, 01 Jul 2018 11:52:10 +0800</pubDate><description><![CDATA[这次看了源码，发现ReentrantLock的底层实现是AQS，而AQS底层实现是Volatile+CAS+CLH队列，因此想看看ReentrantLock与CAS的性能比较，因此做了这么一组实验。

// 使用ReentrantLock
class LockRunnable implements Runnable {
    static int i = 0;

    private Reen...]]></description><category></category></item><item><title><![CDATA[深入AbstractQueuedSynchronized（AQS）源码]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80870916</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80870916</guid><author>dalangzhonghangxing</author><pubDate>Sat, 30 Jun 2018 22:57:22 +0800</pubDate><description><![CDATA[AQS定义了一套多线程访问共享资源的同步器框架，许多同步类实现都依赖于它，如常用的ReentrantLock/Semaphore/CountDownLatch等等



源码

盗用一张图，来源http://www.cnblogs.com/waterystone/p/4920797.html 


AQS通过维护一个private volatile int state，并提供getState(),...]]></description><category></category></item><item><title><![CDATA[深入synchronized原理]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80868147</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80868147</guid><author>dalangzhonghangxing</author><pubDate>Sat, 30 Jun 2018 17:09:59 +0800</pubDate><description><![CDATA[参考博客

synchronized关键字最主要有以下3种应用方式 
1. 修饰实例方法，作用于当前实例加锁，进入同步代码前要获得当前实例的锁 
2. 修饰静态方法，作用于当前类对象加锁，进入同步代码前要获得当前类对象的锁 
3. 修饰代码块，指定加锁对象，对给定对象加锁，进入同步代码库前要获得给定对象的锁。



Java对象头

Java对象头由如下两部分组成： 
1. Mark Word:存...]]></description><category></category></item><item><title><![CDATA[代理模式]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80790380</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80790380</guid><author>dalangzhonghangxing</author><pubDate>Sun, 24 Jun 2018 12:13:35 +0800</pubDate><description><![CDATA[静态代理即，代理类与被代理类都实现一个统一的接口，或继承相同的父类 
静态代理能够在不修改被代理类的情况下，对其功能进行扩展。 
但是因为要依赖接口，如果项目中希望通过代理的方式来实现日志记录，那岂不是每个类都要定义一个接口？



public class StaticProxyDriver {
    // 首先定义一个接口，供代理类与被代理类实现
    static interface A...]]></description><category></category></item><item><title><![CDATA[迭代器模式]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80739594</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80739594</guid><author>dalangzhonghangxing</author><pubDate>Tue, 19 Jun 2018 21:55:53 +0800</pubDate><description><![CDATA[迭代器模式主要用于，对于数组、List、Set等记录多个元素的数据结构，给出一种统一的遍历方式。 
大家不要因为有for(Object o :objects)这个for-each的语法糖的存在，而认为这个模式没用，其实for-each正是使用了Iterator。 
下面写一个简单的例子感受一下，当然为了突出Iterator的作用，在这里也没用for-each。

public class Iter...]]></description><category></category></item><item><title><![CDATA[模板方法模式]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80723952</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80723952</guid><author>dalangzhonghangxing</author><pubDate>Mon, 18 Jun 2018 14:16:23 +0800</pubDate><description><![CDATA[模板方法模式一般用于流程处理，它能够定义一套流程的框架，然后由子类来实现每一个步骤具体的操作。 
通俗一点，就是父类定义一系列接口，并固定这些接口的调用次序；子类只能够细化每一步，无法改变（也不需要改变）这些步骤的执行次序。 
下面我们通过一个例子来感受一下： 我们要实现两个流程上大致一样的操作：烧一条红烧鱼、做一斤小龙虾。我们先抽象一下这两道菜的公共流程：  
1. 杀死它们  
2. 把它们弄...]]></description><category></category></item><item><title><![CDATA[适配器模式]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80723410</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80723410</guid><author>dalangzhonghangxing</author><pubDate>Mon, 18 Jun 2018 12:04:54 +0800</pubDate><description><![CDATA[适配器模式的主要作用是，将一个接口，转换成另一个接口。 
说的在直白点，就是有两个名字、功能、属性、方法的不同的类，使得其中的一个，能通过适配器，能看起来像（实际的实现上一般是由差异的）另一个。 
给一个例子：在java中，早起的Collection有一个elements()方法，通过枚举类来遍历集合集合中的所有元素；但现在都用Iterator，为了避免之前用elements()方法的地方报错，因...]]></description><category></category></item><item><title><![CDATA[命令模式]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80721481</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80721481</guid><author>dalangzhonghangxing</author><pubDate>Sun, 17 Jun 2018 22:29:30 +0800</pubDate><description><![CDATA[命令模式能够封装一系列操作，然后对外给出一个统一的接口，如execute，从而方便执行类可以进行统一的处理，而不同考虑不同操作的差异；实际的场景有工作队列、线程池、日志安排。多线程的run方法就是一个命令模式的典范。 
下面会模拟两组不同的操作 
1. 开关灯 
2. 煮饭——淘米、加水、放入锅子、开火

public class CommandPatternDriver {
    static...]]></description><category></category></item><item><title><![CDATA[装饰者模式]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80718994</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80718994</guid><author>dalangzhonghangxing</author><pubDate>Sun, 17 Jun 2018 15:49:01 +0800</pubDate><description><![CDATA[观察者模式的精髓是，装饰者与被装饰者都源于同一个父类。 
装饰者对父类方法的实现是基于被装饰者的，如DisCount的cost方法需要用到HotGoods的cost方法。 
除了折扣，还有奶茶与珍珠、椰果；手抓饼与烤肠、鸡蛋等场景。 
共同点是折扣、珍珠、椰果、烤肠、鸡蛋不会单卖，都需要依赖商品、奶茶、手抓饼，即在价格上对主要商品进行装饰。

public class DecoratorPatte...]]></description><category></category></item><item><title><![CDATA[观察者模式]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80685523</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80685523</guid><author>dalangzhonghangxing</author><pubDate>Wed, 13 Jun 2018 21:32:49 +0800</pubDate><description><![CDATA[观察者模式由Subject与Observer组成，它们的主要接口如下：



interface Subject{
    // 添加一个观察者
    void registerObserver(Observer observer);

    // 移除一个观察者
    void removeObserver(Observer observer);

    // 通知所有注册的Observ...]]></description><category></category></item><item><title><![CDATA[ThreadLocal概述]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80684783</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80684783</guid><author>dalangzhonghangxing</author><pubDate>Wed, 13 Jun 2018 20:34:33 +0800</pubDate><description><![CDATA[转载自http://blog.xiaohansong.com/2016/08/06/ThreadLocal-memory-leak/

ThreadLocal与线程同步机制不同，线程同步机制是多个线程共享同一个变量，而ThreadLocal是为每一个线程创建一个单独的变量副本，故而每个线程都可以独立地改变自己所拥有的变量副本，而不会影响其他线程所对应的副本。可以说ThreadLocal为多线程环境...]]></description><category></category></item><item><title><![CDATA[Java中引用传递与值传递]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80662932</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80662932</guid><author>dalangzhonghangxing</author><pubDate>Tue, 12 Jun 2018 11:22:56 +0800</pubDate><description><![CDATA[
基本类型为值传递
类、数组、接口为引用传递
final类（例如String、Integer、Double等）虽然是引用传递，但是无法在方法内部改变方法外部变量的值，因为final类的实例改变的时候，会重新创建一个对象，然后将方法中参数的引用指向新的地址。


引用传递，传递的是引用的copy，final类型会改变参数的引用，因此原值不变。...]]></description><category></category></item><item><title><![CDATA[python多线程]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80580420</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80580420</guid><author>dalangzhonghangxing</author><pubDate>Tue, 05 Jun 2018 13:59:42 +0800</pubDate><description><![CDATA[现在的CPU都是多核的，但是我们写的程序大部分都是单核的，为了缩短跑特征的时间，在此介绍下非常有用的python3多线程。



import threading

# 自定义的多线程工具类，
class myThread(threading.Thread):
    # thread_name 线程名称，方便调试
    # func 回调函数
    # begin，end是参数，这里可以该进...]]></description><category></category></item><item><title><![CDATA[AngularJS中Directive传function，并调用]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80442811</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80442811</guid><author>dalangzhonghangxing</author><pubDate>Thu, 24 May 2018 20:12:47 +0800</pubDate><description><![CDATA[在Angularjs中，指令是个好东西，可以极大的提高代码的重用性，也可以使各个模块之间解耦，提高代码的可维护性。但是在实际开发中，仅仅用它来传递值是远远不够的，传递方法在很多情况下比传递值更加有效，下面我来介绍下如何往directiive中传递方法。


收先我们定义一个指令，用来执行controller中的一个方法

    var app = angular.module('App');
 ...]]></description><category></category></item><item><title><![CDATA[Angularjs实现值拷贝，不断开双向绑定]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80359603</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80359603</guid><author>dalangzhonghangxing</author><pubDate>Fri, 18 May 2018 09:20:25 +0800</pubDate><description><![CDATA[$scope.value= newValue; //直接用=号进行赋值操作，会导致双向绑定断开
angular.copy(newValue,  $scope.value);//使用angular.copy可以实现值拷贝，不断开双向绑定]]></description><category></category></item><item><title><![CDATA[Distant Supervision for Relation Extraction via Piecewise Convolutional Neural Networks]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80298755</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80298755</guid><author>dalangzhonghangxing</author><pubDate>Mon, 14 May 2018 15:27:10 +0800</pubDate><description><![CDATA[主要贡献


提出使用PCNN来自动提取特征。
往PCNN中加入multi-instance learning，用来解决远程监督引发的错误标签问题。
提出分段进行max pooling，从而考虑两个Entity之间的结构特征。


作者提出，之前关于关系分类的方法主要分为2种： 
1. 基于特征的方法，这种方式对人工特征向量的要求较高，需要为数据集找出一种合适的特征表示。 
2. 基于kernel...]]></description><category></category></item><item><title><![CDATA[使用nltk + Stanford parser生成句法树]]></title><link>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80299094</link><guid>https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80299094</guid><author>dalangzhonghangxing</author><pubDate>Sun, 13 May 2018 14:27:36 +0800</pubDate><description><![CDATA[在自然语言处理中，句法树是比较有用的特征，特别是生成最短依赖路径SDP。


首先我们要去官网下载jar包。有多种语言可选，也可以下载完整版。
我们下好了之后，解压stanford-parser-full-2018-02-27.zip文件，我们需要其中的如下几个文件: 
stanford-parser-3.9.1-models.jar
stanford-parser.jar
解压stanford-...]]></description><category></category></item></channel></rss>