随笔分类 - 多线程
摘要:利用了AtomicInteger的compareAndSet方法 public class CASLock { private AtomicInteger value = new AtomicInteger(); Thread lockThread ; public boolean tryLock(
阅读全文
摘要:对引用类型的原子性操作 /** * *对引用变量的原子操作 note: *在java中对引用类型的变量,赋值是原子性的,为什么还要有atomicReference,假如要对一个引用类型进行比较,设置等多于一个的操作,还要他们保证原子性时,就要用到 *atomicReference */ public
阅读全文
摘要:什么是ABA问题 在CAS算法中,需要取出内存中某时刻的数据(由用户完成),在下一时刻比较并交换(CPU保证原子操作),这个时间差会导致数据的变化。 1、线程1从内存位置V中取出A2、线程2从内存位置V中取出A3、线程2进行了写操作,将B写入内存位置V4、线程2将A再次写入内存位置V5、线程1进行C
阅读全文
摘要:1 互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 2 同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。 3 同步其实已经实现了互斥,所以同步是一种更为复杂的互斥。 4 互斥是一种特殊的同步。
阅读全文
摘要:AtomicInteger可以保证原子性,可见性,有序性 public class AtomicIntegerTest { private static AtomicInteger value = new AtomicInteger(); public static void main(String
阅读全文
摘要:(1)手动加载mysql驱动实现类 1 Class<?> forName = Class.forName("com.mysql.jdbc.Driver"); 这时加载mysql实现类的是系统类加载器,执行上面的语句会将自己注册到DriverManager中的registeredDrivers。 2
阅读全文
摘要:Balking模式讲的是如果现在不合适执行这个操作,或者没必要执行这个操作,就停止处理,直接返回 自动保存功能的实现逻辑一般都是隔一定时间自动执行存盘操作,存盘操作的前提是文件做过修改,如果文件没有执行过修改操作,就需要快速放弃存盘操作 单次初始化
阅读全文
摘要://设计为单例 public final class ActionContext { // 构造方法私有化 private ActionContext() { } // Holder类 private static class ContextHolder { private final static ActionContext actionContext = new ActionContext()
阅读全文
摘要:Guarded Suspension 设计模式可以保证,当线程在访问某个对象时,发现条件不满足,就挂起等待条件满足时再次访问 public class GuardedSuspensionQueue { // 定义存放Integer类型的queue private final LinkedList queue = new LinkedList(); // 定义q...
阅读全文
摘要:不可变对象需要满足的条件 1 对象创建以后其状态就不能修改 2 对象所有域都是final类型 (这样只能对每个域赋值一次,通过构造器初始化所有成员,进行深度拷贝,在get方法中不直接返回对象本身,而是克隆对象并返回克隆) 3 对象是正确创建的(在对象创建期间,this引用没有逸出)
阅读全文
摘要:/** * ReentrantLock是独占锁 * Lock锁的使用,把锁和要用锁同步的代码放在一起,这里就是放在Printer类中了 * 获取到锁后,最后要在finally代码块中手动释放锁 */ public class LockTest { public static void main(String[] args) { Printer p...
阅读全文
摘要:/*** * 三个线程读数据,三个线程写数据 * */ public class ReadWriteLockTest { public static void main(String[] args) { final ReadWrite rw = new ReadWrite(); for (int i = 0; i < 3; i++) { ...
阅读全文
摘要:public class ReentrantReadWriteLockTest { public static void main(String[] args) throws InterruptedException { // testReenter(); // testUpgrade(); testDowngrade(); } /** * 在同一个线程中,在没有释放写锁的情况下,就去申请读锁,这
阅读全文
摘要:1 被synchronized修饰的方法调用了没有被synchronized修饰的方法,是否线程安全? 2多个方法同步 3线程不安全的例子
阅读全文
摘要:原子性 原子性指的是一个或者多个操作在 CPU 执行的过程中不被中断的特性 在多线程情况下,线程会被操作系统调度进行任务切换,占有CPU时间片段的就执行,否则就阻塞 java中对基础类型的变量赋值是原子性的,int a = 1 ; 但是像这种语句 count++; 在执行的时候,包含3的指令操作
阅读全文
摘要:Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue BlockingQueue是一个接口, 继承Queue接口,Queue接口继承 Collection Blocking
阅读全文
摘要:AQS,即AbstractQueuedSynchronizer, 队列同步器,它是多线程访问共享资源的同步器框架,Java中的ReentrantLock/Semaphore/CountDownLatch等同步组件都依赖于它。它维护了一个同步器状态 (volatile int state 代表共享资源
阅读全文
摘要:lock():若lock被thread A取得,thread B会进入block状态,直到取得lock;tryLock():若当下不能取得lock,thread就会放弃,可以设置一个超时时间参数,等待多久获取不到锁就放弃;lockInterruptibly():跟lock()情況一下,但是threa
阅读全文
摘要:(1)Sleep是线程的方法,wait是Object的方法 (2)Sleep不释放锁,Wait会释放锁,线程进入一个与锁有关的等待队列里 (3)Sleep不需要唤醒,过了休眠时间后,线程主动进入可运行状态,Wait()方法要主动去唤醒,除了Wait(long millis)以外 (4)Sleep不依
阅读全文
摘要:使用多线程可以提高性能的前提条件 (1)任务具有并发性,即任务可以拆分为多个子任务,并发执行 (2)只有在CPU是性能瓶颈的情况下,多线程才能实现提升性能的目的。比如一段程序,瓶颈在于IO操作,那么把这个程序拆分到2个线程中执行,也是无法提升性能的 (3)CPU必须是多核的 多线程的应用场景 (1)
阅读全文

浙公网安备 33010602011771号