发布于 2017-05-22   9人围观   0条评论
最近写了个基于Java Spring的Cache实现方式,但是在刷新缓存的时候,可能会出现各种问题,尤其是在配合多线程的情况下。 下面就来描述一下关于任务执行的各种问题。 # 任务执行 串行的执行效率我们了解的,尤其是碰到一些大的IO操作,CPU是会大量的空闲的。这也是很不好的,会大大影响资源的利用。当然了,多个任务共同执行,也需要确保线程安全。 ## 串行 串行的执行任务,肯定是不需
查看更多
发布于 2017-05-22   7人围观   0条评论
**Java 线程池**管理多个工作线程,其中包含了一个队列,包含着所有等待被执行的任务。开发者可以通过使用`ThreadPoolExecutor`来在Java中创建线程池。 > 线程池是Java中多线程的一个重要概念,因为通过`Thread`模型来控制多线程是非常麻烦以及易错的一个过程。过多的释放线程会造成线程调度的变慢以及过度的消耗内存。而频繁的创建线程,也没有很好的复用线程,所以有了线
查看更多
发布于 2017-05-22   7人围观   0条评论
# Java阻塞队列 这次讨论的是Java的BlockingQueue。`java.util.concurrent.BlockingQueue`是一个Java的队列,支持一系列操作,比如,在获取和移除对象的时候如果队列为空会来等待队列变成非空的,而当队列满了的时候,插入元素会等待队列中的元素被移除,保证队列有空余的空间。 Java的`BlockingQueue`是不能接受`null`的值,如
查看更多
发布于 2017-05-22   5人围观   0条评论
在Java多线程之中,`Callable`和`Future`的使用时非常广泛的。在之前的文章中,我们了解了关于Java[线程池基础](http://blog.csdn.net/ethanwhite/article/details/52971233)的一些内容,知道如何提交`Runnable`的任务。但是,`Runnable`的任务是无法有返回值,也不能抛出异常的。而有些时候,我们希望一个线程能够
查看更多
发布于 2017-05-22   2人围观   0条评论
前文中,我们了解到使用`Callable`以及`Future`接口来处理多项城的一些便利之处。 而`FutureTask`是`Future`接口的一个基础实现,并且提供了异步处理的功能,`FutureTask`包含了一些方法来启动或者取消任务,也包含一些方法来返回`Future`的状态,来确认`Future`是完成了还是去掉了。我们需要一个`Callable`对象来创建一个`FutureTas
查看更多
发布于 2017-05-22   3人围观   0条评论
曾经有一个比较有趣的面试问题,那就是,关于使用`synchronized`关键字,是用在方法上面尾号,还是用在一个代码块上面为好? 答案就是使用锁定代码块为更好。因为这样不会锁定对象。当`synchronized`关键字在实例方法的上面时,线程对于该方法的访问会直接锁定整个对象,参考如下代码: ``` class Sync { public synchronized void sync
查看更多
发布于 2017-05-22   3人围观   0条评论
理解**线程的生命周期**和**线程的状态**在进行多线程操作的过程中是非常重要的。 根据`Thread`的Java doc,我们知道可以通过实现`Runnable`接口或者继承`Thread`,之后调用`start()`方法来启动线程。 ## 线程状态
查看更多
发布于 2017-05-22   4人围观   0条评论
**Java 线程**是一个轻量级执行任务的处理单元。Java提供了`Thread`类来支持多线程,开发者在应用中可以创建多个线程来支持并发执行任务。 在应用中存在两种类型的线程,**用户线程**和**守护线程**。当我们启动应用的时候,main函数是第一个启动的用户线程,开发者可以在之后自由的创建用户线程。当所有的线程执行完毕,JVM会终结掉程序。 开发者也可以配置不同线程的优先级,但是这
查看更多
发布于 2017-05-22   5人围观   0条评论
# Java线程`wait`,`notify`以及`notifyAll` 在Java的`Object`类中包含了3个`final`的方法,这三个方法允许线程来交流资源是否被锁定。这三个方法就是`wait()`,`notify()`以及`notifyAll()`. 在对象上调用这三个方法的线程需要包含一个对象监视器(锁),否则就会抛出`java.lang.IllegalMonitorState
查看更多
多线程    发布于 2017-05-22   2人围观   0条评论
线程安全在Java中是一个很重要的课题。Java提供的多线程环境支持使用Java线程。我们都知道多线程共享一些对象实例的话,可能会在读取和更新共享数据的事后产生*数据不一致*问题。 ## 线程安全 之所以会产生数据的不一致问题,是因为更新实例变量等类似的行为并非是源自操作。这类操作会有三个步骤: * 读取当前的值 * 做一些必要的操作来获取更新的值 * 讲更新的值写会变量之中 我们来看如
查看更多