自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 资源 (1)
  • 收藏
  • 关注

原创 【Java并发编程】原子变量

在java.util.concurrent.atomic包中,提供了原子变量,这里面的所有原子变量都提供了set和get方法。这些变量可以保证“happens-before”的关系。1.非线程安全的class Counter { private int c = 0; public void increment() { c++; } public void

2017-07-31 21:16:59 264

原创 【Java并发编程】并发集合

java.util.concurrent包中包含了一些支持并发操作的集合类,使用这些线程安全的类,早操作中就不必使用锁了。BlockingQueue 定义了先进先出的阻塞队列。ConcurrentMap继承了Map接口,定义了有用的原子操作。这些更新或者删除键值对的操作仅仅当找到对应的key的时候才会执行。或者是一个增加的操作仅仅当key没有的时候才执行。这些操作本身具有原子性,就使得我们在操作

2017-07-31 21:05:21 233

原创 【Java并发编程】Fork/Join

Fork/Join 框架实现了ExecutorService接口,提供了充分利用多处理器的功能。那些可以递归分解为许多小任务的非常适合使用这种方式。Fork/Join 框架采用了“工作窃取算法”——空闲的线程可以从繁忙的线程那些“窃取”一些任务。Fork/Join 框架的核心是类ForkJoinPool,该类是AbstractExecutorService的子类,实现了“工作窃取算法”。可以执行Fo

2017-07-31 17:16:23 280

原创 【Java并发编程】线程池

大多数的executor的实现都使用线程池,这些线程池与Runnable和Callable等任务是分离的,并且常常用来执行多个任务。线程是需要占用一定的内存的,在大型系统中,如果创建、销毁大量线程会产生很大的内存消耗,影响系统性能。本来我们使用线程的初衷是为了充分利用CPU等系统资源,尽可能实现并发操作来节约时间。但是倘若我们走向了另一个极端,创建了大量线程,那么线程本身就会消耗系统大量的资源,我们

2017-07-31 11:10:45 273

原创 【Java并发编程】Executor Interfaces

总括在java.util.concurrent包下,定义了三个Executor Interfaces。 1. Executor接口,一个简单的接口,支持启动一个新任务。 2. ExecutorService接口,继承了Executor接口,提供了管理任务和Executor本身生命周期的相关定义。 3. ScheduledExecutorService,继承了ExecutorService,提供

2017-07-31 00:09:00 345

原创 【Java并发编程】Executors

Executors在前面我们提到的种种线程模型中,有这样一个事实,就是我们创建了一个Thread对象,同时在runnable方法中写相关的耗时操作的逻辑,最后启动Thread对象来执行相应的逻辑。对于一个简单的小程序来说,这是没有问题。但是倘若我们的程序变得庞大和复杂后,将“业务逻辑”和线程的“调度逻辑”绑定得这么紧是不利于程序的扩展的。而想让线程的“调度逻辑”分开,我们有一个不错的选择——使用Ex

2017-07-30 22:55:45 235

原创 【Java并发编程】Lock锁对象

前面我们一直提到的,同步代码(synchronized方法,synchronized变量)依赖于可重入锁,这种锁很容易使用,但是有很多局限性。更复杂的锁在Java.util.concurrent.locks包中,我们今天只简单聊聊Lock对象。Lock对象工作方式很想我们前面提到的同步锁,我们将前面介绍过的锁称作隐示锁。和隐示锁一样,Lock对象一次也只能只能有一个对象拥有该锁。Lock对象也可以通

2017-07-30 10:24:04 1521

原创 【Java并发编程】控制块(保护块)

Guard BlockGuard Block,是一种常见的多个线程通信的代码形式。例如下面的代码,就可以称作Guard Block。这里有一个空循环,joy初始值初始值为false,程序将进入while循环中,直到joy的值变为false为止。这里的joy就是Guard Block中Guard的含义,像是一个守卫一样。public void guardedJoy() { // Simple

2017-07-28 11:34:05 379

原创 【Java并发编程】活性

活性是用来形容应用程序在短时间执行的能力死锁死锁是这样一种状况,两个或者多个线程彼此等待,而永远处在阻塞的状态。这里我们给出一个死锁的例子:有两个朋友彼此都遵循一个很礼节——向对方鞠躬,一定要等待对方直身自己才能直身。其实不看代码我们也知道这里的问题,就是如果两个人同时鞠躬,那么他们将陷入一种死锁的状态。都在等待对方直身。下面我们看一写这个简单的代码。public class Deadlock {

2017-07-27 18:34:51 260

原创 【Java并发编程】原子性访问

对于原子性的操作,意味着该操作要么发生并且完成,要么什么都不发生。有些操作是原子性的,例如 1. 读、写引用变量、基础变量(long,double除外)是具备原子性的 2. 读、写声明成volatile变量。任何被volatile修饰的变量,都保证了可见性,也就是说任何对volatile变量的写操作,与之后对该变量的读操作都具备“happens-before”的关系。但是由于volatile关键

2017-07-27 17:54:35 222

原创 【Java并发编程】内在锁和同步

同步是建立在一个内部的实体——内在锁(或者叫做“监视锁”)基础之上的。内在锁在同步的两个方面互斥和可见性上都发挥着作用。每个对象都有一个内在锁。通常来说,如果一个线程想独占某一个某个对象的属性变量,那么它首先要获取该对象的内在锁。在一个线程获取一个内在锁和释放这个内在锁之间这段时间,就称作拥有这个内在锁。当一个线程获得某个对象的内在锁,其他线程是不能再次获取的。如果其他线程再次获取,那么哪些线程将会

2017-07-27 11:45:19 311

原创 【Java并发编程】synchronized方法

有两种同步的语法:同步方法和同步语句。同步方法就死在方法的前面加上synchronized关键字。被synchronized修饰的方法有这样两个作用:第一,它保证了互斥性。也就是说在同一时刻只能有一个线程访问该方法。其他线程访问该该方法只能挂起。第二,它保证了可见性。也就是说,在该方法结束后执行的语句可以看到方法中对于变量的改变。也就是满足了“happens-before”的关系。这是一个很管用的关

2017-07-27 10:16:50 244

原创 【Java并发编程】内存一致性错误

内存一致性错误说的是:不同线程看到的内存中的同一份数据却有不同的“视图”。这个时候我们们说发生了内存一致性错误。内存一致性错误是我们应该避免的。而避免内存一致性错误的关键在于理解“happens-before”关系。这个关系保证了向内存中写入的一条语句可以被其他语句“看到”。我们来看下面的例子:初始化变量counter,该变量在线程A和线程B中间共享int counter = 0;线程A先执行cou

2017-07-25 22:44:06 708

原创 【Android Studio】Live Template

Live Template

2017-07-13 17:07:38 511

原创 【Java并发编程】Join

Thread的join方法,是一个挺可爱而且形象的名字,“加入”。既然是加入,那么这个方法一定不是用在单单一个线程上的。一方加入另一方至少需要两个线程。事实上,join这个方法涉及到线程之间协作的。比如有两个线程Thread1和Thread2,我们启动了两个线程,如果我们在Thread1运行的过程中,在Thread1的线程中调用了Thread2的join方法,那么Thread1将暂停执行,直到Thr

2017-07-02 16:32:12 221

原创 【Java并发编程】interrupt

interrup是用来告诉线程应该停下来,去做些其他别的事情。但是这取决于编程人员的态度,他可以决定一个线程应该怎样对到来的interrupt做出反应。我们通过调用某个Thread对象的interrupt方法,来告诉那个线程我希望你能中断下来,但是,这只是一厢情愿,具体收到请求的Thread线程怎样处理接下来的事情完全取决于它自己。但是,通常来讲,它应该将自己设计成可以响应这种中断请求的。这里不得不

2017-06-29 11:38:47 283

原创 【Java并发编程】Thread.sleep,暂停程序执行

Thread.sleep 方法可以用来暂停程序执行,并且可以通过参数指定暂停多久。这将使得CPU腾出时间来处理别的线程,或者是别的应用程序。要注意的是,sleep方法虽然可以指定暂停的时间,但是并不能认为,程序会精确地暂停那么长时间,因为首先这种暂停的状态是可以被中断(interrupt)的。另外,这还取决于具体操作系统。

2017-06-23 23:54:18 647

原创 【Java并发编程】Thread方式创建线程

线程对象在Java语言中,有两种方式使用线程 1. 使用Thread对象本身来创建一个新的线程,并且在其中执行异步逻辑处理。 2. 另外一种就是将异步逻辑封装成一个任务,将任务交给Executor处理。第一种方法是比较基础,后一种稍微高级一点。

2017-06-20 17:03:43 457

原创 【Java并发编程】Process进程 和 Thread线程

进程与线程的概念是要了解的很大的一个的概念,有了这个宏观的概念,才能继续探讨并发细致的方面

2017-06-20 16:37:37 721

原创 在Mac上编译运行C++

Mac 上通过命令行编译运行C++

2017-06-06 22:17:21 2467

原创 LinkedList数据结构与源码分析

LinkedList

2017-02-04 17:17:43 318

原创 为什么要写博客

这篇文章阐述了我为什么从写私人技术文章到写开放的博客的历程

2017-01-14 14:47:44 226

Python编程 从入门到实践 [超高清]

《Python编程 从入门到实践》 超高清,有目录,有源码!

2017-10-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除