摘要:一.ReadWriteLock是什么 ReadWriteLock是一个接口,提供了readLock和writeLock两种锁的操作机制,一个是只读的锁,一个是写锁。 读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的(排他的)。 每次只能有一个写线程,但是可以有多个线程并发地读数据。 所有读写
阅读全文
随笔分类 - Java并发
摘要:一.ReentrantLock是什么 ReentrantLock是一个可重入的互斥锁(Reentrant就是再次进入的意思),又被称为“独占锁”。它添加了类似锁投票、定时锁等候和可中断锁等候的一些特性。 ReentrantLock在同一个时间点只能被一个线程获取(当某线程获取到“锁”时,其它线程就必
阅读全文
摘要:一.Condition是什么 关键字synchronize可以与wait()和nitify()方法相结合实现实现等待/通知模式,类ReentrantLock也可以实现同样的功能,但需要借助condition对象。 Java里 sychronized和Lock+Condtion 都属于管程模型,Con
阅读全文
摘要:一.内存模型的相关概念 计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。 由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快, 而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的
阅读全文
摘要:一.wait/notity的使用 wait()方法可以使线程进入等待状态,而notify()可以使等待的状态唤醒。 这样的同步机制十分适合生产者、消费者模式:消费者消费某个资源,而生产者生产该资源。 当该资源缺失时,消费者调用wait()方法进行自我阻塞,等待生产者的生产;生产者生产完毕后调用not
阅读全文
摘要:一.wait/notify是什么 等待/通知机制,是指一个线程A调用了对象O的wait()方法进入等待状态,而另一个线程B调用了对象O的notify()/notifyAll()方法, 线程A收到通知后退出等待队列,进入可运行状态,进而执行后续操作。 上诉两个线程通过对象O来完成交互,而对象上的wai
阅读全文
摘要:一.Volatile是什么 Java语言规范第三版中对volatile的定义如下: java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。 Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile
阅读全文
摘要:一.Volatile的使用 1、防止重排序 我们从一个最经典的例子来分析重排序问题。大家应该都很熟悉单例模式的实现,而在并发环境下的单例实现方式,我们通常可以采用双重检查加锁(DCL)的方式来实现。 其源码如下: package com.paddx.test.concurrent; public c
阅读全文
摘要:一.synchronized 的用法分类 Java中每一个对象都可以作为锁,这是synchronized实现同步的基础: 1、普通同步方法(实例方法),锁是当前实例对象 ,进入同步代码前要获得当前实例的锁 2、静态同步方法,锁是当前类的class对象 ,进入同步代码前要获得当前类对象的锁 3、同步方
阅读全文
摘要:一.Synchronized是什么 synchronized 是 Java提供的一个并发控制的关键字,是利用锁的机制来实现同步的。 锁机制有如下两种特性: (1)互斥性: 即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机制,这样在同一时间只有一个线程对需同步的代码块(复合
阅读全文
摘要:一.使用synchronized关键字 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。 注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类。 同步是一种高开销的操作
阅读全文
摘要:一.为什么要用线程池 (1)减少资源的开销 ; (2)减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。 (3)提高响应速度 ,每次请求到来时,由于线程的创建已经完成,故可以直接执行任务,因此提高了响应速度。 提高线程的可管理性 ,线程是一种稀缺资源,若不加以限制,不仅会占用
阅读全文
摘要:一.基础概念 1.Executors创建线程池: Java中创建线程池很简单,只需要调用Executors中相应的便捷方法即可,比如Executors.newFixedThreadPool(int nThreads),但是便捷不仅隐藏了复杂性,也埋下了潜在的隐患(OOM,线程耗尽)。 Executo
阅读全文
摘要:一.使用Callable多线程: 通过Callable接口实现多线程 实现Callable重写call方法; 实现Callable和实现Runnable类似,但是功能更强大,具体表现在: a.可以在任务结束后提供一个返回值,Runnable不行; b.call方法可以抛出异常,Runnable的ru
阅读全文
摘要:前言: 对于开发的网站,如果网站的访问量非常大的话,那么就需要考虑相关的并发访问问题了。 一.同步和异步的区别和联系 所谓同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到返回的值或消息后才往下执行其它的命令。 异步,执行完函数或方法后,不必阻塞性
阅读全文