Java
文章平均质量分 80
sunhaoning
这个作者很懒,什么都没留下…
展开
-
maven项目依赖显示缺少jdk1.6 tools.jar
方法一:然后在pom.xml中添加: <dependency> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId> <version>1.6</version> &am原创 2018-07-23 09:27:00 · 3574 阅读 · 1 评论 -
《Java高并发程序设计》学习 --2.4 分门别类的管理:线程组
线程组的使用如下:public class ThreadGroupName implements Runnable {@Overridepublic void run() {String groupAndName = Thread.currentThread().getThreadGroup().getName()+ "-" + Thread.currentThread().g原创 2017-03-15 21:46:32 · 255 阅读 · 0 评论 -
《Java高并发程序设计》学习 --7.11 软件事务内存
在一些函数式编程语言中,支持一种叫做软件事务内存(STM)的技术。这里的事务和数据库中所说的事务非常类似,具有隔离性、原子性和一致性。与数据库事务不同的是,内存事务不具备持久性。在很多场合,某一项功能可能要由多个Actor协作完成。在这种协作事务中,如果一个Actor处理失败,那么根据事务的原子性,其他Actor所进行的操作必须要回滚。下面,看一个简单的案例。假设有一个公司要给它的员工发福原创 2017-04-10 22:55:03 · 973 阅读 · 0 评论 -
《Java高并发程序设计》学习 --7.10 多个Actor同时修改数据:Agent
在Actor的编程模型中,Actor之间主要通过消息进行信息传递。因此,很少发生多个Actor需要访问一个共享变量的情况。但在实际开发中,这种情况很难完全避免。如果多个Actor需要对同一个共享变量进行读写时,如何保证线程安全呢?在Akka中,使用一种叫做Agent的组件来实现这个功能。一个Agent提供了对一个变量的异步更新。当一个Actor希望改变Agent的值时,它会向这个Agent下发原创 2017-04-10 22:51:41 · 887 阅读 · 0 评论 -
《Java高并发程序设计》学习 --2.3 volatile与Java内存模型(JMM)
volatile的定义如下: java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。volatile对于保证操作的原子性是有非常大的帮助的。但是,volatile并不能代替锁,它无法保证一些复合操作的原子性,例如,volatile是无法保证i++的原子性操作的:public class PlusTask {static vo原创 2017-03-15 21:39:06 · 269 阅读 · 0 评论 -
《Java高并发程序设计》学习 --2.2 初始线程:线程的基本操作
1)新建线程Java提供了线程类Thread来创建多线程的程序。其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线程,有两种方法:◆ 需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法; ◆ 实现Runnalbe接口,重载Runnalbe接口中的run()方原创 2017-03-15 21:32:34 · 312 阅读 · 0 评论 -
《Java高并发程序设计》学习 --2.1 基本概念
1)进程进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。2)线程线程是轻量级进程,是程序执行的最小单位。使用多线程而不是多进程去进行并发程序设计,是因为线程间的切换或调度的成本远小于进程。3)线程的状态:NEW状态表示刚刚创建的线程,这种线程还没原创 2017-03-15 21:30:19 · 238 阅读 · 0 评论 -
《Java高并发程序设计》学习 --1.3有关并行的两个重要定律
1)Amdahl定律加速比定义:加速比= 优化前系统耗时/优化后系统耗时 根据Amdahl定律,使用多核CPU对系统进行优化,优化的效果取决于CPU的数量以及系统中串行程序的比重。CPU数量越多,串行化比重越低,则优化效果越好。仅提高CPU核数不降低系统串行程序比重,也无法提高系统性能。2)Gustafson定律根据G原创 2017-03-15 09:06:35 · 497 阅读 · 0 评论 -
《Java高并发程序设计》学习 --1.4Java内存模型
1)原子性原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。比如,对于一个静态全局变量int i,两个线程同时对它赋值,线程A给它赋值1,线程B给它赋值为-1。那么不管这2个线程以何种方式、何种步调工作,i的值要么是1,要么是-1、线程A和线程B之间是没有干扰的。这就是原子性的一个特点,不可被中断。但是如果不使用int而使用long原创 2017-03-15 21:20:28 · 365 阅读 · 0 评论 -
《Java高并发程序设计》学习 --5.8 并行排序
1)分离数据相关性:奇偶交换排序对于奇偶交换排序来说,它将排序过程分为两个阶段,奇交换和偶交换。对于奇交换来说,它总是比较奇数索引以及其相邻的后续元素。而偶交换总是比较偶数索引和其相邻的后续元素。并且,奇交换和偶交换会成对出现,这样才能保证比较和交换涉及到数组中的每一个元素。下面是奇偶交换排序的串行实现:public static void oddEvenSort(int[] arr)原创 2017-03-25 09:22:47 · 362 阅读 · 2 评论 -
《Java高并发程序设计》学习 --5.7 并行搜索
对于有序数据,通常可以采用二分查找法。对于无序数据,则只能挨个查找。在本节中,我们将讨论有关并行的无序数组的搜索实现。给定一个数组,我们要查找满足条件的元素。对于串行程序来说,只要遍历一下数组就可以得到结果。但如果要使用并行方式,则需要额外增加一些线程间的通信机制,使各个线程可以有效地运行。一种简单的策略就是将原始数据集合按照期望的线程数进行分割。每个线程各自独立搜索,当其中一个线程找到数原创 2017-03-25 09:18:01 · 372 阅读 · 0 评论 -
《Java高并发程序设计》学习 --5.6 并行流水线
并发算法虽然可以充分发挥多核CPU的性能,但并非所有的计算都可以改造成并发形式。执行过程中有数据相关性的运算都是无法完美并行化的。假如现在有两个数,B和C。如果要计算(B+C)*B/2,那么这个运算过程就是无法并行的。原因是,如果B+C没有执行完成,则永远算不出(B+C)*B,这就是数据相关性。遇到这种情况,可以借鉴日常生产中的流水线思想。类似的思想可以借鉴到程序开发中。即使(B+C)原创 2017-03-25 09:15:53 · 759 阅读 · 0 评论 -
《Java高并发程序设计》学习 --5.5 并行模式之 Future模式
它的核心是异步调用,如果我们不着急要结果,可以让被调用者立刻返回,随后让它在后台慢慢处理这个请求,对于调用者来说则可以处理其他任务,在真正需要数据的场合再去尝试获得需要的结果。1)Future模式的主要角色参与者作用Main系统启动,调用Client发出请求Client返回Data对象,立即返回Futu原创 2017-03-20 19:54:43 · 404 阅读 · 0 评论 -
《Java高并发程序设计》学习 --2.6 线程优先级
下面的代码展示了优先级的作用。高优先级的线程倾向于更快地完成。public class PriorityDemo {public static class HightPriority extends Thread {static int count = 0;@Overridepublic void run() {while(true) {synchronized (Pr原创 2017-03-15 22:02:33 · 341 阅读 · 0 评论 -
《Java高并发程序设计》学习 --2.8 隐蔽的错误
1)无提示的错误案例int v1 = 1073741827;int v2 = 1431655768;int ave = (v1+v2)/2;System.out.println(ave);上述代码中,视图计算v1和v2的均值。这是一个典型的溢出问题。v1+v2的结果已经导致了int的溢出。2)并发下的ArrayListArrayList是一个线程不安全的容器原创 2017-03-15 22:26:02 · 337 阅读 · 0 评论 -
Java8 Stream
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行...原创 2018-06-24 21:10:51 · 189 阅读 · 0 评论 -
Java8的Lambda表达式
Lambda是一个匿名函数,可以把Lambda表达式理解为一段可以传递的代码。通过Lambda表达式可以写出更简洁、更灵活的代码,提升了Java语言的表达能力。从匿名类到Lambda的转换Java8之前的匿名内部类:Comparator<Integer> com = new Comparator<Integer>() { @Override ...原创 2018-03-14 16:42:55 · 317 阅读 · 0 评论 -
RDD转换为DataFrame案例
文件students.txt中内容如下:1,leo,172,marry,173,jack,184,tom,191. 使用反射方式将RDD转换为DataFrameJava代码如下:public class RDD2DataFrameReclection { public static void main(String[] args) { SparkConf c原创 2017-08-15 20:01:38 · 1633 阅读 · 0 评论 -
Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题,及处理方法
在Windows下用文本编辑器创建的文本文件,如果选择以UTF-8等Unicode格式保存,会在文件头(第一个字符)加入一个BOM标识。这个标识在Java读取文件的时候,不会被去掉,而且String.trim()也无法删除。如果用readLine()读取第一行存进String里面,这个String的length会比看到的大1,而且第一个字符就是这个BOM。这转载 2017-07-27 15:56:11 · 319 阅读 · 0 评论 -
Spark基础transformation操作实例(Java版)
1.map算子任何类型的RDD都可以调用map算子;在java中,map算子接收的参数是Function对象,在Function中,需要设置第二个泛型类型为返回的新元素的类型;同时,call()方法的返回类型也需要与第二个泛型的返回类型一致。在call()方法中,对原始RDD中的每一个元素进行各种处理和计算,并返回一个新的元素,所有新的元素组成一个新的RDD。private static原创 2017-04-23 17:21:35 · 1266 阅读 · 0 评论 -
eclipse报错Resource is out of sync with the file system的解决方法
这是文件系统不同步的问题。解决方法:需要手动刷新一下资源管理器(1)在eclipse或mycelipse中,点击工程目录右键,选择refresh(2)设置eclipse或mycelipse自动刷新,Window->Preferences->General->Workspace,选中Refresh automatically原创 2017-07-23 23:27:07 · 567 阅读 · 0 评论 -
《Java高并发程序设计》学习 --7.1 Akka之Hello World
首先看一下,第一个Actor的实现:public class Greeter extends UntypedActor { public static enum Msg { GREET,DONE; } @Override public void onReceive(Object msg) throws Exception { if(msg ==Msg.GREET) { S原创 2017-04-06 21:33:50 · 2431 阅读 · 0 评论 -
《Java高并发程序设计》学习 --6.7. 原子类的增强
无锁的原子类操作使用系统的CAS指令,有着远远超越锁的性能。在Java 8中引入了LongAddr类,这个类也在java.util.concurrent.atomic包下,因此,它也是使用了CAS指令。1)更快的原子类:LongAddrAtomicInteger的基本实现机制,它们都是在一个死循环内,不断尝试修改目标值,知道修改成功。如果竞争不激烈,那么修改成功的概率就很高,否则,修改失败原创 2017-04-04 19:49:58 · 440 阅读 · 0 评论 -
《Java高并发程序设计》学习 --3.1多线程的团队协作:同步控制
1)synchronized的功能扩展:重入锁重入锁可以完全替代synchronized关键字。在JDK5.0的早期版本,重入锁的性能远远好于synchronized,但从JDK6.0开始,JDK在synchronized上做了大量的优化,使得两者的性能差距并不大。重入锁使用java.util.concurrent.locks.ReentrantLock类来实现,如下代码:import原创 2017-03-17 09:04:01 · 830 阅读 · 0 评论 -
《Java高并发程序设计》学习 --5.11 AIO
虽然NIO在网络操作中,提供了非阻塞的方法,但是NIO的IO行为还是同步的。对于NIO来说,我们的业务线程是在IO操作准备好时,得到通知,接着就由这个线程自行进行IO操作,IO操作本身还是同步的。对于AIO,它不是在IO准备好时再通知线程,而是在IO操作依据完成后,再给线程发出通知。因此,AIO是完全不会阻塞的。此时,我们的业务逻辑将变成一个回调函数,等待IO操作完成后,由系统自动触发。下原创 2017-03-25 20:24:57 · 277 阅读 · 0 评论 -
《Java高并发程序设计》学习 --5.10 网络NIO
JavaNIO中涉及的基础内容有通道(Channel)和缓冲区(Buffer)、文件IO和网络IO。1)基于Socket的服务端的多线程模式这里,以Echo服务器为例。对于Echo服务器,它会读取客户端的一个输入,并将这个输入原封不动地返回给客户端。服务器会为每一个客户端连接启用一个线程,这个新的线程将全心全意为这个客户端服务。同时,为了接受客户端连接,服务器还会额外使用一个派发线程。原创 2017-03-25 20:21:37 · 361 阅读 · 0 评论 -
《Java高并发程序设计》学习 --5.9 并行模式之并行算法:矩阵乘法
在矩阵乘法中,第一个矩阵的列数和第二个矩阵的行数必须是相同的。如果需要进行并行计算,一种简单的策略是可以将A矩阵进行水平分割,得到子矩阵A1和A2,B矩阵进行垂直分割,得到子矩阵B1和B2。此时,我们只要分别计算这些子矩阵的乘积,将结果进行拼接,就能得到原始矩阵A和B的乘积。我们使用ForkJoin框架来实现这个并行矩阵相乘的想法。为了方便矩阵计算,我们使用jMatrces开源软件,作为矩阵计原创 2017-03-25 20:15:03 · 1158 阅读 · 1 评论 -
《Java高并发程序设计》学习 --1.2并发级别
1)阻塞一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行。当我们使用synchronized关键字,或者重入锁时,我们得到的就是阻塞的线程。 无论是synchronized还是重入锁,都会在视图执行后续代码前得到临界区的锁,如果得不到,线程就会被挂起等待,直到占有了所需要的资源为止。2)无饥饿如果线程间是有优先级的,那么线程调用总是会倾向于满足高优先级的线原创 2017-03-15 09:03:20 · 917 阅读 · 0 评论 -
Java报异常:java.lang.UnsupportedOperationException
在使用Arrays.asList()后调用add,remove这些method时出现java.lang.UnsupportedOperationException异常。这是由于Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList。Arrays$ArrayList和ArrayList都是继承AbstractList,remove,add原创 2017-03-15 08:38:51 · 429 阅读 · 0 评论 -
[解决]Check $M2_HOME environment variable and mvn script match.
1.添加M2_HOME的环境变量2.Preference->Java->Installed JREs->Edit 选择一个jdk,添加 -Dmaven.multiModuleProjectDirectory=$M2_HOME原创 2017-03-15 08:36:02 · 340 阅读 · 0 评论 -
《Java高并发程序设计》学习 --1.1基础概念
1)同步和异步同步和异步通常用来形容一次方法调用。同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者可以继续后续的操作。2)并发和并行他们都表示两个或者多个任务一起执行。并发偏重于多个任务交替执行,多个任务之间有可能还是串行的。并行的多个任务是真实的同时执行。3)临界区原创 2017-03-15 08:56:17 · 556 阅读 · 0 评论 -
《Java高并发程序设计》学习 --2.7 线程安全的概念与synchronized
下面的代码演示了一个计数器,两个线程同时对i进行累加操作,各执行10000000次。在很多时候,i的最终值会小于20000000。这就是因为两个线程同时对i进行写入时,其中一个线程的结果会覆盖另一个。public class AccountingVol implements Runnable {static AccountingVol instance = new AccountingVo原创 2017-03-15 22:10:55 · 402 阅读 · 0 评论 -
《Java高并发程序设计》学习 --5.4 高性能的生产者-消费者:无锁的实现
BlockingQueue实现生产者-消费者是一个不错的选择,它很自然地实现了作为生产者和消费者的内存缓冲区。但是,BlockingQueue并不是一个高性能的实现,它完全使用锁和阻塞等待来实现线程间的同步。在高并发场合,它的性能并不是特别优越。 就像我们之前提过的ConcurrentLinkedQueue是一个高性能的队列,但是BlockingQueue只是为了方便数据共享。而Concurren原创 2017-03-20 19:45:45 · 1180 阅读 · 0 评论 -
《Java高并发程序设计》学习 --5.3 并行模式之生产者-消费者模式
生产者-消费者是一个经典的多线程设计模式,它为多线程间的协作提供了良好的解决方案。在生产者-消费者模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程负责具体处理生产者提交的任务。生产者和消费者之间则通过共享内存缓冲进行通信。 生产者-消费者模式的核心组件是共享内存缓冲区,它作为生产者消费者间的通信桥梁,避免了两者直接通信,从而将生产者和消费者进原创 2017-03-20 19:33:18 · 508 阅读 · 0 评论 -
《Java高并发程序设计》学习 --5.2 并行模式之不变模式
在并行软件的开发过程中,同步操作似乎是不可避免的,当多线程对同一个对象进行读写操作时,为了保证数据一致性和正确性,有必要对对象进行同步。而同步操作对系统的性能是有相当的损耗的,为了尽可能的取出这些同步操作,提高程序并行能力,可以使用一种不可变对象,依靠对象的不变性 可以确保其在没有同步操作的多线程环境中依然时钟保持内部状态一致性和正确性,这就是不变模式。不变模式天生就是多线程友好的,它的核原创 2017-03-20 19:02:19 · 416 阅读 · 0 评论 -
《Java高并发程序设计》学习 --5.1 探讨单例模式
它是一种对象创建模式,用于产生一个对象的具体实例,确保系统中一个类只有一个实例。这样带来的好处主要有两点: 1. 对于频繁使用的对象,可以省略new操作花费的时间,这样对于那些重量级对象而言,可以节省非常可观的一笔系统开销。2. 由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻GC压力,缩短GC停顿时间。下面给出了一个单例的实现,这个实习生非常简单的,但无疑是一个正原创 2017-03-20 18:57:58 · 243 阅读 · 0 评论 -
《Java高并发程序设计》学习 --4.4 无锁
对于并发控制,锁是一种悲观的策略。它总是假设每一次的临界区操作会产生冲突。如果有多个线程同时需要访问临界区资源,就宁可牺牲性能让线程进行等待,所以说锁会阻塞线程执行。而无锁是一种乐观的策略,它会假设对资源的访问是没有冲突的。无锁的策略使用一种叫做比较交换的技术(CAS Compare And Swap)来鉴别线程冲突,一旦检测到冲突产生,就重试当前操作直到没有冲突为止。1)比较交换(CAS)原创 2017-03-19 22:09:54 · 861 阅读 · 0 评论 -
《Java高并发程序设计》学习 --4.2 Java虚拟机对锁优化所做的努力
1)锁偏向锁偏向是一种针对加锁操作的优化手段。它的核心思想是:如果一个线程获得了锁,那么锁就进入偏向模式。当这个线程再次请求锁时,无须再做任何同步操作。这样就节省了大量有关锁申请的操作,从而提高了程序性能。因此,对于几乎没有锁竞争的场合,偏向锁有比较好的优化效果,因为连续多次极有可能是同一个线程请求相同的锁。而对于锁竞争比较激烈的场合,其效果不佳。因为在竞争激烈的场合,最有可能的情况是每次都是原创 2017-03-18 19:03:00 · 738 阅读 · 0 评论 -
《Java高并发程序设计》学习 --4.3 ThreadLocal
3. ThreadLocal当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。下面看一个简单的示例: private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M原创 2017-03-18 19:14:48 · 436 阅读 · 0 评论 -
《Java高并发程序设计》学习 --3.3 JDK的并发容器
1)并发集合简介JDK提供的并发容器大部分在java.util.concurrent包中。如下所示:ConcurrentHashMap : 一个高效的线程安全的HashMap。CopyOnWriteArrayList : 在读多写少的场景中,性能非常好,远远高于vector。ConcurrentLinkedQueue : 高效并发队列,使用链表实现,可以看成线程安全的Lin原创 2017-03-17 20:14:21 · 454 阅读 · 0 评论