本文不说synchronized相关,它就是JAVA的一个保留关键字,jdk自己实现了它,但说真的,可应用场景真的少,相比lock接口,它还是被淘汰好吧;

首先,说说lock接口,lock接口是一个工具类,我们可以自己实现它,但是太麻烦,所以可以直接使用它的实现类,ReentrantLock();
它的方法有:lock() 这个方法可指定在那里上锁,但要记住,lock()方法在jvm抛出异常后不会自动解锁,所以需要我们使用try{}catch(){}块
来捕捉异常,之后在finally里将锁解开;
trylock() 此方法和lock方法相同,只是它会有一个返回值,如果当前线程获取到锁则为true,否则为false;我们可以利用此来做一些事情;例:
if(lock.trylock()){
syso("获得锁")
}else{
syso("没获取到锁")
}
trylock(long time,TimeUnit unit),和上面一个方法一样,只是有一个等待时间,并且可指定时间单元(时,分,秒)

lockInterruptibly()方法和之前几个不太一样,它更像是一个打断方法(是打断获取不到锁处于等待时期的线程,而并非已经获取到锁的线程),如果
一个线程获取不到锁而进入等待,之后又有另一个线程(一般为主线程)调用了它的lockInterruptibly()方法,它会立马中断并抛出异常;

ReentrantReadWriteLock()方法可以获得写锁和读锁,读锁可以多个线程获取到,而写锁则只有一个线程可以获取到,如果写锁被获取到,则读锁也无法被线程获取;
同理,如果读锁被获取到,则写锁会一直等待占用读锁的线程释放读锁;

公平锁:每个线程获取锁的顺序根据调用lock()方法的顺序;
非公平锁:每个线程获锁的顺序是随机的;
在ReentranReadAndWriteLock(Boolean bool);true为公平锁,false或不填则为非公平锁;

线程池:
SingleThreadExcutor; 只有一个线程的线程池,如果线程池中的线程正在工作,而有新任务来了,那么必须等当前线程工作完进入闲置状态才能开始新的任务
也正因此,此线程池可用于需要顺序提交任务的(说实话,很鸡肋,就算是多线程,我使用队列就能解决提交任务的顺序问题了);
CachedThreadPool;个人任务最好用的线程池,可以无限扩容(在性能允许的情况下),并且空置线程有个生命周期,默认为60秒,一旦60秒不被调用,即被销毁掉;
FixedThreadPool;见其名知其义,可以在创建的时候就定义好线程数量,并立即创建,如果没有任务,就一直处于等待状态,适合清楚知道并发量的场景下使用;
ScheduledThreadPool;这个没什么好说的,需要在创建的时候就定义线程数量,可以定时的处理一些任务,创建线程后,线程一直处于等待,直到指定时间才开始任务;
SingleScheduledThreadPool;上面的单例版.....(受不了这些单例版的线程池,既然都单例了,我还要你何用...)

Callable接口,和Runable接口不同的是,它是有返回值的(没错,异步执行,但却可以得到返回值...),返回值是一个Future对象,在实现Callable的时候定义泛型,泛型要与返回值一致(当然,直接将泛型类型传递到返回值即可);
与实现Runable的线程类使用start方法执行线程任务不同的是,Callable接口的线程实现类是通过submit执行线程任务,Future对象有个isDone()方法,返回True和False,是用来判断方法是否完成,get()方法则可以获取到返回值,当然,如果线程任务没完成会一直堵塞.
可以用来进行一些数据计算量比较大的逻辑,在主线程运行此线程后,直接在需要的地方get()一下就行.大大提高运行效率;

BlockingQueue 一个接口
下面有四个实现类,常用的两种为:ArrayBlockingQueue(需要在创建的时候自定义长度的),LinkedBlockingQueue(链表模式自然不用定义长度,当然你也可以定义,默认长度为Integer.MAX_VALUE)
这个没什么好说的,用来实现中间件的,了解即可,其实就是几个方法,有的获取不到元素就一直堵塞直到有元素,有的元素满了就等待有空位置再去添加;

Volatile关键字
这个就得好好说说了,而且得从JVM运作原理说起,我们JVM执行任务的时候啊,不是在我们电脑里那些4G啊,8G啊内存中执行的,而是在CPU中的一小块内存区域执行的(为什么?因为快啊),
我们硬盘里的内存叫做主内存,而CPU的内存呢,则叫工作内存,在多线程情况下,因为现在都是多核了,自然有多个CPU,多个工作内存,而在不加Volatile关键字的情况下,我们多个工作内存
会将一个公共的成员数据的值复制一份放在它们各自的内存中,但如果加了Volatile关键字的话,它们拿的就只是个引用(也就是数据在内存中的地址),这样每次其它线程对数据做操作的时候,其它的
线程都知道,毕竟它们操作的是同一份数据,这样也就保证了并发情况下的可见性.但是!!!不要以为高并发情况下加了它就安全了,它数据操作非原子性的情况下也不是线程安全的(什么叫原子性?就是操作细粒度最小的级别,比如赋值啊,对一个数字+1(只是+1,但不赋值,要不然就是两步操作了)),
这样会导致一个情况,比如你一个线程对一个数据进行++的操作,例:X++;在我们看来是一步,但CPU要进行4步,先拿到值,再+1,再赋值,最后返回值.这样在中途的话可能会切换到其它线程.而此时数据并没有更新到主内存,其它线程拿到的依旧是没有更新前的数据.自然就产生了脏数据;
所以Volatile关键字的应用场景一般用来做原子性的操作就好~

2018/1/15 JAVA多线程相关的更多相关文章

  1. Java多线程相关的

    很多小伙伴在学习Java的时候,总是感觉Java多线程在实际的业务中很少使用,以至于不会花太多的时间去学习,技术债不断累积!等到了一定程度的时候对于与Java多线程相关的东西就很难理解,今天需要探讨的 ...

  2. Java多线程相关面试题及答案-整理

    1.什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完成 ...

  3. Java[3] Java多线程相关资料

    Java多线程: http://www.uml.org.cn/j2ee/201509093.asp

  4. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  5. 2018.4.17 java多线程练习二模拟开场仪式进场

    2.某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工,利用多线程模拟年会入场过程, 并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码.线程 ...

  6. 2018.4.16 Java多线程实现龟兔赛跑

    龟兔赛跑(通过多线程来实现 里面的具体方法) TT.java package com.lanqiao.demo3; /** * 乌龟 * @author Administrator * */ publ ...

  7. java多线程相关代码

    1.创建线程的三种方式 使用Thread package com.wpbxx.test; //1.自定义一个类,继承java.lang包下的Thread类 class MyThread extends ...

  8. 2018.6.15 Java对象序列化详解

    一.定义 Serializable 序列化:把Java对象转换为字节序列的过程. 反序列化:把字节序列恢复为Java对象的过程. ObjectOutputStream对象输出流 可以将实现了Seria ...

  9. Java多线程相关的常用接口

    Runnable 是一个接口,里面只声明了一个方法run();返回值为void所以无法拿到执行完的结果.只能通过共享变量或者线程通信来搞定.Future就是对具体的Runable或者Callable任 ...

随机推荐

  1. ECharts 环形饼图 动态获取json数据

    ECharts  环形饼图 动态获取json数据 效果图如下: 一.html部分 <div id="secondPieChart" style="width:100 ...

  2. struts中用kindeditor实现的图片上传并且显示在页面上

    做公司网站的时候由于需要在内容属性中加入图片,所以就有了这个问题,本来一开始找几篇文章看都是讲修改kindeditor/jsp/file_manager_json.jsp和upload_json.js ...

  3. ceph-deploy出错UnableToResolveError Unable to resolve host

    背景 ps:在本文中,假设我系统的hostname为node1. 使用ceph-deploy命令搭建Ceph集群,执行ceph new node1时,出现如下错误: [node1][INFO ] Ru ...

  4. linux 下CentOS 下 npm命令安装gitbook失败的问题

    运行环境 linux 服务器:CentOS 7.0 系统:安装了nodejs :使用 npm 安装 gitbook 出现错误提示: npm install -g gitbook-cli symbol ...

  5. CSS中的定位与浮动

    CSS中的定位与浮动 本文主要讲述CSS中的三种定位样式static.relative和absolute的区别以及浮动元素的特征. 定位样式 CSS中定位样式position的取值有三个,默认值:st ...

  6. 织梦在服务器上面安装的时候一直提示data文件没有权限,可我已经写了权限,还是提示

    1.进入服务器,打开IIS,点击相应无权限的文件夹data,然后点击右上角的编辑权限. 2.勾选写入,然后确定即可. 3.织梦一直收到黑客的攻击,这里建议站长朋友设置下权限,来降低织梦系统的危险系数. ...

  7. APIs

    应用程序接口(application programe interfaces)

  8. Java 对二值化图片识别连通域

    用Java 对 已经 二值化了的图片 标记连通域 每块的连通域都标记不一样的数字 public static void main(String [] args) throws IOException ...

  9. J.U.C atomic 数组,字段原子操作

    这里看一下原子数组操作和一些其他的原子操作. AtomicIntegerArray/AtomicLongArray/AtomicReferenceArray的API类似,选择代表性的AtomicInt ...

  10. Linux - ubuntu中vi不能正常使用方向键与退格键的问题

    一度怀疑是键盘坏了! 之前安装solaris也是这个问题! 重新安装vim就可以了! $sudo apt-get remove vim-common $sudo apt-get install vim