摘要:
一、为什么要使用Atomic类? 看一下下面这个小程序,模拟计数,创建10个线程,共同访问这个int count = 0 ;每个线程给count往上加10000,这个时候你需要加锁,如果不加锁会出现线程安全问题,但是使用AtomicInteger之后就不用再做加锁的操作了,因为AtomicInteg 阅读全文
摘要:
CAS操作号称无锁优化,也叫作自旋;对于一些常见的操作需要加锁,然后jdk就提供了一些以Atomic开头的类,这些类内部自动带了锁,当然这里的锁并非是用synchronized来实现的,而是通过CAS操作来实现的; 一、下面是 AtomicInteger 的使用: package com.desig 阅读全文
摘要:
首先volatile有两大功能: 保证线程可见性 禁止指令重排序 1、保证线程可见性 首先我们来看这样一个程序,其中不加volatile关键字运行的结果截然不同,加上volatile程序能够正常结束,不加则程序进入死循环; package com.designmodal.design.juc01; 阅读全文
摘要:
一、为什么要使用synchronized关键字? 1、使用synchronized关键字的原因:在并发编程问题中存在着共享数据,在多线程操作共享数据时,要保证同一时刻只有一个线程在执行某个方法或某个代码块; synchronized既保证了原子性,又保证了可见性,所以可以使用synchronized 阅读全文
摘要:
常见的线程状态有六种: 1.新建状态(new):当我们new 了一个线程,但是没有调用start()方法; 2.Runnable状态:此状态包含两个状态: 就绪状态(Ready):当线程调用了start()方法时,线程就进入了就绪状态; 运行状态(Running):当该线程被系统的调度器选中就会进入 阅读全文
摘要:
下面给大家介绍线程几个简单的方法: sleep(); yield(); join(); 1、sleep(); sleep的意思就是睡眠的意思,当前线程停下来一段时间 ,让给其他的线程去执行,sleep的复活是完全取决于睡眠的时间,睡眠的时间到了自己会自动复活; 2、yield(); yield的意思 阅读全文
摘要:
既然学习多线程,那你就要知道线程是如何创建的,线程又是如何启动的,下面就看一下,线程的创建和启动; 1、创建线程的方法一般有三种: 继承Thread类 实现Runnable接口 实现Callable接口 2、启动线程的方法一般有四种: new T01().start(); new Thread(ne 阅读全文
摘要:
在模板模式中,定义了一个公开的执行模板的方法,字类可以按照需自己实现方法,但是它们的调用方法是必须要按照抽象类的方式来进行。 意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 主要解决:一些方法通用,却在每一个子类都 阅读全文
摘要:
观察者模式主要存在于一对多的情况下,一个对象的修改需要通知多个依赖它的对象,它属于行为型的一种模式; 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协 阅读全文
摘要:
策略模式中一个类的行为可以在运行的时候进行更改,我们需要定义一个策略的接口,让所有的具体策略实现这个接口,然后封装一个可以执行策略的对象,可以通过传入不同的策略,执行不同的算法; 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决:在有多种算法相似的情况下,使用 if. 阅读全文