随笔分类 - Java
摘要:1.同步 synchronized 2.轮询 while volatile 3.wait/notify机制 syncrhoized加锁的线程的Object类的wait()/notify()/notifyAll() ReentrantLock类加锁的线程的Condition类的await()/sign
阅读全文
摘要:ThreadLocal入门 ThreadLocal 提供了线程本地的实例。它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的实例副本。 ThreadLocal 变量通常被private static修饰。当一个线程结束时,它所使用的所有 ThreadLocal 相对的实例副本都可被
阅读全文
摘要:CyclicBarrier也叫回环栅栏,在JDK1.5被引入,可以让一组线程达到一个栅栏时被阻塞,直到最后一个线程达到栅栏时,所以被阻塞的线程才能继续执行。 CyclicBarrier好比一扇门,默认情况下关闭状态,堵住了线程执行的道路,直到所有线程都就位,门才打开,让所有线程一起通过。 叫做回环是
阅读全文
摘要:CountDownLatch也叫闭锁,在JDK1.5被引入,允许一个或多个线程等待其他线程完成操作后再执行。 CountDownLatch内部会维护一个初始值为线程数量的计数器,主线程执行await方法,如果计数器大于0,则阻塞等待。 当一个线程完成任务后,计数器值减1。当计数器为0时,表示所有的线
阅读全文
摘要:Semaphore也叫信号量,在JDK1.5被引入,用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量。还可以用来实现某种资源池,或者对容器施加边界。 Semaphore内部维护了一组虚拟的许可,许可的数量可以通过构造函数的参数指定。 访问特定资源前,必须使用acquire方法获
阅读全文
摘要:我们假设对写操作的请求比对读操作的请求更重要,就要提升写请求的优先级。 此外,如果读操作发生的比较频繁,我们又没有提升写操作的优先级,那么就会产生“饥饿”现象。 请求写操作的线程会一直阻塞,直到所有的读线程都从ReadWriteLock上解锁了。
阅读全文
摘要:final 可以作为修饰符修饰变量、方法和类。 被final修饰的变量必须在初始化时给定初值,以后在使用时只能被引用而不能被修改。 被final修饰的方法不能够在子类中被重写(override); 被final修饰的类不能够被继承。 finally finally用在异常处理中定义总是执行代码,无论
阅读全文
摘要:反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。 通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。 程序中一般的对象的类型都是在编译期就确定下来的,而Java反射机制可以动态地创建
阅读全文
摘要:传统同步阻塞I/O模型: 之所以使用多线程,主要原因在于socket.accept()、socket.read()、socket.write()三个主要函数都是同步阻塞的,当一个连接在处理I/O的时候,系统是阻塞的。 如果是单线程的话必然就挂死在那里,但CPU是被释放出来的,开启多线程,就可以让CP
阅读全文
摘要:AQS(AbstractQueuedSynchronizer)是JDK1.5提供的一个用来构建锁和同步工具的框架,子类包括常用的ReentrantLock、CountDownLatch、Semaphore等。 AQS没有锁之类的概念,它有个state变量,是个int类型 ,state 是同步状态位,
阅读全文
摘要:CAS,在Java并发应用中通常指CompareAndSwap,即比较并交换。 CAS是一个原子操作,它比较一个内存位置的值并且只有相等时修改这个内存位置的值为新的值,保证了新的值总是基于最新的信息计算的,如果有其他线程在这期间修改了这个值则CAS失败。 synchronized属于重量级锁,很多时
阅读全文
摘要:HashMap的线程不安全主要体现在resize时的死循环及使用迭代器时的fast-fail上。 Fast-fail: fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。 在使用迭代器的过程中如
阅读全文
摘要:简介: HashMap: 具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。 HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。 HashMap的线程不安全主要体现在resize时的
阅读全文
摘要:可以用wait()和notify()来实现,也可以用阻塞队列,下面介绍阻塞队列: 阻塞队列: BlockingQueue阻塞队列提供可阻塞的put和take方法,以及支持定时的offer和poll方法。如果队列已经满了,那么put方法将阻塞直到空间可用;如果队列为空,那么take方法将阻塞直到有元素
阅读全文
摘要:Synchronized 同步代码块 使用 monitorenter 和 moniterexit 指令实现, monitorenter指令插入到同步代码块的开始位置, moniterexit 指令插入到同步代码块的结束位置, jvm 需要保证每一个 monitorenter 都有一个 moniter
阅读全文
摘要:一、线程池概念 线程池: 线程池从字面意思来看,是指管理一组同构工作线程的资源池。 在线程池中执行任务比「为每一个任务分配一个线程」优势更多。 通过重用现有的线程而不是创建新线程,可以在处理多个请求时分摊在线程创建和销毁过程中产生的巨大开销。 另外一个额外的好处是,当请求到达时,工作线程通常已经存在
阅读全文
摘要:Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用时用具体的类型来替换。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 创建集合时就指定集合元素的类型,该集合只能保存其指定类
阅读全文
摘要:Java为每种基本数据类型都提供了对应的包装器类型 从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可以了: Integer i = 10; 这个过程中会自动根据数值创建对应的 Integer对象,这就是装箱。 实际上,执行上面那句代码的时候,
阅读全文
摘要:含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以
阅读全文
摘要:override(重写,覆盖) 1、方法名、参数、返回值相同。 2、子类方法不能缩小父类方法的访问权限。 3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。 4、存在于父类和子类之间。 5、方法被定义为final不能被重写。 overload(重载,过载) 1、参数类型、个数、顺
阅读全文