随笔分类 - 多线程
摘要:在开发过程中,ThreadLocal一般会建议采用private static修饰,这样做既有好处也有坏处。好处是它一定程度上可以避免错误,至少可以避免 重复创建TSO(Thead Specific Object,即ThreadLocal所关联的对象)所导致的浪费。坏处是这样做可能正好形成内存泄漏所
阅读全文
摘要:Lock和Synchronized的区别 下面主要以可重入锁ReentrantLock为例。 两者相同点是: 都实现了多线程同步和内存可见性语义。 都是可重入锁。 两者不同点是: 同步实现机制不同,synchronized是通过Java对象头锁标记和Monitor对象实现同步;而ReentrantL
阅读全文
摘要:synchronized的原理 Java对象头。java对象头中主要包括两部分数据,Mark Word(标记字段,用处存储对象自身的运行时数据,比如哈希码、GC分代年龄、锁状态标志ACC_SYNCHRONIZED、偏向线程ID等)和Klass Pointer(类型指针)。其中Klass Point是
阅读全文
摘要:sleep和wait的区别。 sleep()方法是Thread类的静态方法,wait()方法是Object超类的成员方法。 sleep不会让锁,让的是CPU,时间到了就立马执行(不需要竞争锁)。wait会,但要被notify唤醒去竞争锁。 sleep可以在任何地方用,wait只能在同步代码方法或块中
阅读全文
摘要:线程池就是先维护一定数量的线程池中,需要时从线程池取出线程来执行任务。优点是不需要反复创建和销毁线程,减少开销,便于管理。缺点是需要维护一个线程池,CPU占用大。java通过ThreadPoolExecutor来创建线程池: new ThreadPoolExecutor(int corePoolSi
阅读全文
摘要:Java多线程实现方式主要有四种: 继承Thread类。由于java单继承特性,缺点就是不能再继承其他类了,可扩展性差。Thread类自己本身就实现了Runable接口,只不过提供了更多的可用方法和成员而已。 实际开发中Thread和Runable差别不大,都可以用。非要说区别就是一个是类,一个是接
阅读全文
摘要:CAS(compareAndSet) JDK1.6后synchronized优化,效率和CAS操作差不多了,而且可读性更高。 无锁算法,但看起来是乐观锁的思想,原子操作指令。CAS 操作包含三个操作数:内存中的旧值(V)、预期值(A)和新值(B),旧值是volatile修饰的,一个线程修改,保证
阅读全文
摘要:volatile的原理 volatile是轻量级的synchronized。保证"可见性",线程每次都会去主内存去读变量,而不是缓存;保证有序性,即不会出现指令重排。但volatile无法保证复合操作的原子性,对任意单个volatile变量的读/写(单纯赋值)具有原子性,但类似于volatile++
阅读全文