Dolphin

Java并发编程:Lock

风流意气都作罢 提交于 2021-02-18 12:31:33
Java并发编程:Lock   在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。   也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述。本文先从synchronized的缺陷讲起,然后再讲述java.util.concurrent.locks包下常用的有哪些类和接口,最后讨论以下一些关于锁的概念方面的东西   以下是本文目录大纲:   一.synchronized的缺陷   二.java.util.concurrent.locks包下常用的类   三.锁的相关概念介绍   若有不正之处请多多谅解,并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:   http://www.cnblogs.com/dolphin0520/p/3923167.html 一.synchronized的缺陷   synchronized是java中的一个关键字,也就是说是Java语言内置的特性。那么为什么会出现Lock呢?   在上面一篇文章中,我们了解到如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁

金灿灿的季节

夙愿已清 提交于 2021-02-04 04:26:14
在这个金灿灿的收获季节,经过 Apache DolphinScheduler PPMC 们的推荐和投票,Apache DolphinScheduler 收获了 5 位新Committer 。他们是:nauu(朱凯)、Rubik-W(温合民)、gabrywu、liwenhe1993、clay4444。 对于成为 Committer ,小伙伴们说道: 朱凯 : 非常荣幸能够成为DolphinSchedule 的 Committer。这既是一份喜悦,也是一份责任。我将以终为始,继续打怪升级,助力 DS 早日毕业。 温合民 : 很荣幸成为DS Committer团队的一员。通过技术调研了解到DS,最终选型决定引入DS,高效的社区支持使项目最终顺利落地。DS是我参与开源的第一个项目,深受益于开源,同时也想为开源做一些力所能及的贡献,希望未来能更多的为DS添砖加瓦,愿DS顺利毕业。 社区介绍: Apache DolphinScheduler 是一个非常多样化的社区,至今贡献者已近100名, 他们分别来自 30 多家不同的公司。 微信群用户3000人。 Apache DolphinScheduler 部分用户案例(排名不分先后) 已经有300多家企业和科研机构在使用DolphinScheduler,来处理各类调度和定时任务,另有 近500家 公司开通了海豚调度的试用: Apache

Java并发编程:阻塞队列

試著忘記壹切 提交于 2021-01-30 10:15:12
点击上方“ Java知音 ”,选择“置顶公众号” 技术文章第一时间送达! 作者:海子 http://www.cnblogs.com/dolphin0520/p/3932906.html 知音专栏 Javaweb练手项目源码下载 常用设计模式完整系列篇 100套IT类简历模板下载 Java常见面试题汇总篇 在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了Dequeue接口)。 使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦。但是有了阻塞队列就不一样了,它会对当前线程产生阻塞,比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素。当队列中有元素后,被阻塞的线程会自动被唤醒(不需要我们编写代码去唤醒)。这样提供了极大的方便性。 本文先讲述一下java.util

K-均值聚类算法

坚强是说给别人听的谎言 提交于 2021-01-24 14:16:50
一.k均值聚类算法 对于样本集 。"k均值"算法就是针对聚类划分 最小化平方误差: 其中 是簇Ci的均值向量。从上述公式中可以看出,该公式刻画了簇内样本围绕簇均值向量的紧密程度,E值越小簇内样本的相似度越高。 工作流程: k-均值算法的描述如下: 创建k个点作为起始质心(通常随机选择) 当任意一个点的簇分配结果发生改变时: 对数据集中的每个点: 对每个质心: 计算质心与数据点之间的距离 将数据点分配到距离其最近的簇 对每一个簇,计算簇中所有点的均值并将均值作为质心 接下来是对于数据集testSet.txt的代码实现: 1.658985 4.285136 -3.453687 3.424321 4.838138 -1.151539 -5.379713 -3.362104 0.972564 2.924086 -3.567919 1.531611 0.450614 -3.302219 -3.487105 -1.724432 2.668759 1.594842 -3.156485 3.191137 3.165506 -3.999838 -2.786837 -3.099354 4.208187 2.984927 -2.123337 2.943366 0.704199 -0.479481 -0.392370 -3.963704 2.831667 1.574018 -0.790153 3

Java并发编程之阻塞队列

不问归期 提交于 2021-01-24 01:57:27
作者:海子 原文:http://www.cnblogs.com/dolphin0520/p/3932906.html 使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦。但是有了阻塞队列就不一样了,它会对当前线程产生阻塞,比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素。当队列中有元素后,被阻塞的线程会自动被唤醒(不需要我们编写代码去唤醒)。这样提供了极大的方便性。 本文先讲述一下java.util.concurrent包下提供主要的几种阻塞队列,然后分析了阻塞队列和非阻塞队列的中的各个方法,接着分析了阻塞队列的实现原理,最后给出了一个实际例子和几个使用场景。   一.几种主要的阻塞队列   二.阻塞队列中的方法 VS 非阻塞队列中的方法   三.阻塞队列的实现原理   四.示例和使用场景 若有不正之处请多多谅解,并欢迎批评指正。 一.几种主要的阻塞队列 自从Java 1.5之后,在java.util.concurrent包下提供了若干个阻塞队列,主要有以下几个: ArrayBlockingQueue:基于数组实现的一个阻塞队列,在创建ArrayBlockingQueue对象时必须制定容量大小。并且可以指定公平性与非公平性

Java并发编程:Lock

ぃ、小莉子 提交于 2020-12-18 03:58:57
Java并发编程:Lock   在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问 传送门 。本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。   也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述。本文先从synchronized的缺陷讲起,然后再讲述java.util.concurrent.locks包下常用的有哪些类和接口,最后讨论以下一些关于锁的概念方面的东西 一.synchronized的缺陷   synchronized是java中的一个关键字,也就是说是Java语言内置的特性。那么为什么会出现Lock呢?   在上面一篇文章中,我们了解到 如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁 ,而这里获取锁的线程释放锁只会有两种情况:   1)获取锁的线程执行完了该代码块,然后线程释放对锁的占有;   2)线程执行发生异常,此时JVM会让线程自动释放锁。   那么如果这个获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了,但是又没有释放锁

Java多线程——线程的创建方式

社会主义新天地 提交于 2020-12-16 16:02:58
Java多线程——线程的创建方式 摘要:本文主要学习了线程的创建方式,线程的常用属性和方法,以及线程的几个基本状态。 部分内容来自以下博客: https://www.cnblogs.com/dolphin0520/p/3913517.html https://www.cnblogs.com/trust-freedom/p/6606594.html 线程的创建 Thread类和Runnable接口 Thread类实现了Runnable接口,实现了Runnable接口里的run()方法。 事实上,查看Thread类的实现源代码会发现Thread类是实现了Runnable接口的。 在Java中,这2种方式都可以用来创建线程去执行子任务,具体选择哪一种方式要看自己的需求。直接继承Thread类的话,可能比实现Runnable接口看起来更加简洁,但是由于Java只允许单继承,所以如果自定义类需要继承其他类,则只能选择实现Runnable接口。 不论哪种方式创建线程,都必须重写run()方法,在run()方法中定义需要执行的任务。 创建好了自己的线程类之后,就可以创建线程对象了,然后 通过start()方法 去启动线程。注意,不是调用run()方法启动线程,run()方法中只是定义需要执行的任务,如果 调用run()方法 ,即 相当于在主线程中执行run()方法 ,跟普通的方法调用没有任何区别

[多线程] Java线程池应用及原理分析(JDK1.8)

生来就可爱ヽ(ⅴ<●) 提交于 2020-12-13 20:03:00
一 线程池优点   1、线程在创建和销毁时是非常耗费资源的,使用 线程池可以减少创建和销毁线程的次数 ,每个工作线程都可以重复使用。   2、可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。   对操作系统来说,创建一个线程的代价是十分昂贵的, 需要给它分配内存、列入调度,同时在线程切换的时候还要执行内存换页,CPU 的缓存被清空。切换回来的时候还要重新从内存中读取信息,破坏了数据的局部性。   关于时间,创建线程使用是直接向系统申请资源的,这里调用系统函数进行分配资源的耗时不好说。   关于资源,Java线程的线程栈所占用的内存是在Java堆外的,所以是不受java程序控制的,只受系统资源限制,默认一个线程的线程栈大小是1M(当让这个可以通过设置 -Xss 属性设置,但是要注意栈溢出问题),但是,如果每个用户请求都新建线程的话,1024个用户光线程就占用了1个G的内存,如果系统比较大的话,一下子系统资源就不够用了,最后程序就崩溃了。   PS:同样的道理在java程序中也不要随意开启新的线程,特别是高频业务尽量使用线程池,不然很容易导致内存不足,程序崩溃的问题。 二 线程池创建    java.uitl.concurrent.ThreadPoolExecutor 类是线程池中最核心的一个类,因此如果要透彻地了解Java中的线程池

如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题

 ̄綄美尐妖づ 提交于 2020-11-22 19:29:03
如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题 参考文章: (1)如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题 (2)https://www.cnblogs.com/dolphin0520/p/3153501.html 备忘一下。 来源: oschina 链接: https://my.oschina.net/u/4438370/blog/4706949

Java并发编程:volatile关键字解析

那年仲夏 提交于 2020-11-13 13:00:11
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。   volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景。   以下是本文的目录大纲:   一.内存模型的相关概念   二.并发编程中的三个概念   三.Java内存模型   四..深入剖析volatile关键字   五.使用volatile关键字的场景   若有不正之处请多多谅解,并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:   http://www.cnblogs.com/dolphin0520/p/3920373.html 一.内存模型的相关概念   大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快