Java线程的调度
线程调度一般指的是系统为线程分配处理器使用权的过程,这个过程会产生上下文切换,即操作系统的CPU利用时间片轮转的方式给每个任务分配一定的执行时间,然后把当前任务状态保存下来,接着加载下一任务的状态并执行,它是一个状态保存与加载的过程。 一般线程调度模式分为两种——抢占式调度和协…
Java线程的CPU时间片
当前运行线程主动放弃CPU,JVM暂时放弃CPU操作(基于时间片轮转调度的JVM操作系统不会让线程永久放弃CPU,或者说放弃本次时间片的执行权),例如调用yield()方法。 当前运行线程因为某些原因进入阻塞状态,例如阻塞在I/O上。 当前运行线程结束,即运行完run()方法里…
如何生成指定分布的随机数
对于随机数平时我们还是比较常用的,一般都会直接通过各种语言原生自带的随机函数,比如 c++ 中有random()函数,java 中有 Random 类,python 有 random 模块等等。都能很方便生成随机变量,但它们有一个特点,那就是都服从均匀分布,而有些场景需要要生成…
乐观的并发策略——基于CAS的自旋
悲观者与乐观者的做事方式完全不一样,悲观者的人生观是一件事情我必须要百分之百完全控制才会去做,否则就认为这件事情一定会出问题;而乐观者的人生观则相反,凡事不管最终结果如何,他都会先尝试去做,大不了最后不成功。这就是悲观锁与乐观锁的区别,悲观锁会把整个对象加锁占为自有后才去做操作…
智能算法之提升方法
提升方法的核心思想是通过将多个效果很一般的分类器(弱分类器)组合起来综合考虑,以实现一个效果较好的分类器,这就像“三个臭皮匠赛过诸葛亮”。弱学习者学习出来的效果可能只比随机分类器效果好一点,于是有人提出用一个弱分类器集合生成一个强分类器。 因为是将弱分类器提升为强分类器,所以叫…
悲观的并发策略——synchronized互斥锁
互斥锁是最常见的同步手段,在并发过程中,当多条线程对同一个共享数据竞争时,它保证共享数据同一时刻只能被一条线程使用,其他线程只有等到锁释放后才能重新进行竞争。 对于Java开发人员,最熟悉的肯定就是用synchronized关键词完成锁功能,在涉及到多线程并发时,对于一些变量,…
条件随机场实现命名实体识别
NLP 被很多人称为人工智能皇冠上的明珠,可见其在 AI 领域的重要性,而命名实体识别(NER)又一直是 NLP 领域的研究热点,所以这块任务是 NLP 必谈的。 NER 早期的实现主要是基于词典和规则,然后是基于传统的机器学习,比如 HMM、MEMM 和 CRF。随后深度学习…
深入谈谈String.intern()在JVM的实现
String 类的intern方法可能大家比较少用也比较陌生,虽然实际项目中并不太建议使用intern方法,可以在 Java 层来实现类似的池,但我们还是要知道它的原理机制不是。 通过该方法可以返回一个字符串标准对象,JVM 有一个专门的字符串常量池来维护这些标准对象,常量池是…
双向循环神经网络及TensorFlow实现
循环神经网络得益于其记忆功能使其擅长处理序列方面的问题,它能提取序列之间的特征,进而对序列输出进行预测。比如我说“我肚子饿了,准备去xx”,那么根据前面的序列输入来预测“xx”很可能就是“吃饭”。 所谓的单向循环神经网络其实就是常见的循环神经网络,可以看到t时刻、t-1时刻、t…
JVM的ServerSocket是怎么实现的(下)
JDK 为我们提供了 ServerSocket 类作为服务端套接字的实现,通过它可以让主机监听某个端口而接收其他端的请求,处理完后还可以对请求端做出响应。它的内部真正实现是通过 SocketImpl 类来实现的,它提供了工厂模式,所以如果自己想要其他的实现也可以通过工厂模式来改…
JVM的ServerSocket是怎么实现的(上)
JDK 为我们提供了 ServerSocket 类作为服务端套接字的实现,通过它可以让主机监听某个端口而接收其他端的请求,处理完后还可以对请求端做出响应。它的内部真正实现是通过 SocketImpl 类来实现的,它提供了工厂模式,所以如果自己想要其他的实现也可以通过工厂模式来改…
卷积神经网络文本分类
卷积神经网络(CNN)在图像处理领域取得了很大的成绩,它的卷积和池化结构能很好提取图像的信息,而在 NLP 领域循环神经网络(RNN)则使用的更多,RNN 及其各种变种因拥有记忆功能使得它们更擅长处理上下文。但 NLP 领域很多方面使用 CNN 取得了出色的效果,比如语义分析、…
mysql协议
公众号的菜单已分为“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。
本地方法怎么映射Java层的数据类型
Java 语言上定义了不同的数据类型,比如有基础类型int、double等等,还有所有类的父类Object等,这些都是 Java 层面的类型,而使用本地方法的处理过程需要有它们对应的类型。 Java 层编写的本地方法,被编译器编译为字节码,字节码将按照规范将不同类型的参数给记录…
文本分析——分配单词权重
文本处理中很多时候会需要给每个单词分配权重,有了权重以便后续进一步处理。常用的算法主要是TF-IDF。 TF,即Term Frequency。我们可以将文档看成由若干词(term)组成,那么文档中某个term出现的频率就是TF。词频和词权重存在关系,可以用来作为词权重的衡量因素…
System.arraycopy为什么快
在 Java 编程中经常会遇到数组拷贝操作,一般会有如下四种方式对数组进行拷贝。 for遍历,遍历源数组并将每个元素赋给目标数组。 clone方法,原数组调用clone方法克隆新对象赋给目标数组,更深入的克隆可以看之前的文章《从JDK角度看对象克隆》。 System.array…
近期的爬虫工作杂谈
最近在做自然语言理解处理相关的东西,主要是信息抽取方面的需求,由于没有好的公开数据集用作训练及测试,于是只能先自己去权威平台上爬取收集数据,所以这就涉及到了爬虫。 写爬虫用什么语言?由于我较熟且常用的大语言是 java、c++ 和 python。所以用这三种语言写爬虫其实都可以…
从JDK源码看Java域名解析
在互联网中通信需要借助 IP 地址来定位到主机,而 IP 地址由很多数字组成,对于人类来说记住某些组合数字很困难,于是,为了方便大家记住某地址而引入主机名和域名。 早期的网络中的机器数量很少,能很方便地通过 hosts 文件来完成主机名称和 IP 地址的映射,这种方式需要用户自…
智能算法之隐马尔可夫模型(HMM)
前面的《马尔科夫模型》主要是研究能直接观察到的序列的概率问题,通过马尔科夫假设能建立起马尔科夫链,从而解决一些序列问题。但有时候观察的对象并不是我们待处理的目标对象,它的规律隐含在观察对象中,观察的事件和隐含事件存在一定的相关关系,这时候就要用到隐马尔科夫模型(HMM)。 比如…
从JDK角度看对象克隆
对象克隆其实是很常见的操作,它完成的功能是将现有对象内容(属性)拷贝到新的对象中,得到的是一个新的对象,而并不只是一个对象引用。 其实对于属性不多的对象我们可以直接通过编写代码逐一属性复制,比如我们可以直接 new 一个新对象,然后通过 set 方法将属性值一个个设置进去。但这…