1.volatile关键字:当多个线程操作共享数据时,可以保证内存中的数据可见,相较于syncronized是一种较为轻量级的同步策略,

  注意:1.volatile不具有“互斥性”

     2.volatile不能保证变量的"原子性"

2.i++的原子性问题:i++的操作实际上分为三个步骤”读-改-写“

  int i = 10;

  i = i++;//10

  

  int temp = i;

  i = i+1;

  temp = i;

3.解决原子性的方式:原子变量:jdk1.5后,java.util.concurrent.atomic 包下提供了常用的原子性变量,变量的特点如下

          1.volatile保证内存可见性

          2.CAS(compare and swap)算法保证数据的原子性

             CAS算法是硬件对于并发操作共享数据的支持

           CAS包含3个操作数:

            内存值V

            预估值A

            更新值B

            当且仅当V == A 时,V = B,否则,将不做任何操作

ConcurrentHashMap采用”锁分段“级别

CountDownLatch:闭锁操作

实现Callable的方式相比于实现Runnable接口的方式区别:可以存在返回值,可以抛出异常,执行Callable的方式,需要FutureTask<>实现类的支持,用于接收运算结果,FutureTask是Future接口的实现类

解决多线程安全的三种方式

1.synchronized同步代码块

2.synchronized同步方法

3.Lock 同步锁,显示锁:需要通过lock()进行上锁,必须进行unlock()解锁,更加灵活,使用Lock等待,lock.newCondition();

生产者-消费者模式种,使用wait()和notify()实现等待唤醒机制,使用这个机制的原因是,如果不进行等待,则消费者或生产者在条件不满足的情况下,还是会去频繁进行条件判断

为了避免虚假唤醒问题(多个生产者和消费者,造成数据错乱的现象),应该把wait()始终使用在循环中,wait()方法会使当前线程进入阻塞状态,并且释放锁对象,sleep()方法并不会释放当前锁,若是不存在互斥的方法,则sleep的时候执行其他方法

ReadWriteLock  读写锁

原则:

写写/读写 需要”互斥“  写数据的同时再写,可能造成数据错误,写数据的时候同时读,可能读到不完整的数据,所以都需要互斥

读读 不需要”互斥“  并发的读取数据,并不需要互斥,不会造成差错

所以:读取数据的时候,可以允许有多个读锁,但是写数据的时候,只能有一个写锁,这种方式的效率,相对于独占锁来讲,至少并发读取数据方面,是有较大提升的

线程池:提供了一个线程队列,队列种保存着所有等待状态的线程。避免了创建与销毁的额外开销,提升响应速度。

线程池的体系结构:

  java.util.concurrent.Executor:负责线程的使用与调度的根接口

    |--ExecutorService:子接口,线程池的主要接口

      |--ThreadPoolExecutor:实现类

      |--ScheduledExecutorService:子接口,负责线程的调度

        |--ScheduledThreadPoolExecutor:继承ThreadPoolExecutor和实现ScheduledExecutorService

工具类:Executors

ExecutorService: newFixedThreadPool():创建固定大小的线程池

ExecutorService:newCachedThreadPool():缓存线程池,线程池中的线程数量不固定,可以根据需求自动更改数量

ExecutorService:newSingledThreadPool():创建一个只有一个线程的线程池

ScheduledExecutorService:newScheduledThreadPool():创建固定大小的线程池,还可以定时或延时执行任务

          

  

Java 线程高级的更多相关文章

  1. Java线程的概念

    1.      计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...

  2. 细说进程五种状态的生老病死——双胞胎兄弟Java线程

    java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的. 系统根据PCB结构中的状态值控制进程. 单CPU系统中,任一时刻处于执行状态的进程只有一个. 进程的五种状 ...

  3. Java线程的5个使用技巧

    萝卜白菜各有所爱.像小编我就喜欢Java.学无止境,这也是我喜欢它的一个原因.日常工作中你所用到的工具,通常都有些你从来没有了解过的东西,比方说某个方法或者是一些有趣的用法.比如说线程.没错,就是线程 ...

  4. java线程的理解

    java thread类都是native方法实现的,所以没有用平台无关的方法实现,怎么实现的呢? 线程的实现: 第一种:使用内核线程实现. 内核线程就是直接使用操作系统内核支持的线程,由内核完成切换. ...

  5. Java线程与Linux内核线程的映射关系[转]

    Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是 ...

  6. Java线程池的原理及几类线程池的介绍

    刚刚研究了一下线程池,如果有不足之处,请大家不吝赐教,大家共同学习.共同交流. 在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大 使用线程池的好处: 减少在创建和销毁线程上所 ...

  7. Java线程池与java.util.concurrent

    Java(Android)线程池 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行 ...

  8. Java线程(二):线程同步synchronized和volatile

    上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程 ...

  9. 程序员的视角:java 线程(转)

    在我们开始谈线程之前,不得不提下进程.无论进程还是线程都是很抽象的概念,有一个关于进程和线程很形象的比喻能帮我们更好的理解. 进程就像个房子,房子是一个包含了特定属性的容器,例如空间大小.卧室数量等. ...

随机推荐

  1. davinci入门必读

    http://www.usr.cc/forum.php/static/image/smiley/tiger/archiver/forum.php?mod=viewthread&action=p ...

  2. Computer Abstractions

    计算机系统结构的概述 (MOOC:计算机系统设计) 组成: 硬件:CPU +MM(主存)+I/O(输入/输出) 软件:系统软件+应用软件 层次结构: 发展简史: 第一代:真空管  ·ENIAC ·冯诺 ...

  3. apache配置跨域请求代理

    1.配置允许跨域请求 Header always set Access-Control-Allow-Origin "*"Header always set Access-Contr ...

  4. windows下使用make

    为了方便使用windows下的编辑器写代码并使用make命令,所以在windows上也安装make,教程如下 windows下使用gcc和g++需要安装MinGW32,如果已经安装过了,参考这里,然后 ...

  5. HDU1074 Doing Homework(状压dp)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意:给定有n门课的作业,每门课交作业有截止时间,和完成作业所花费的时间,如果超过规定时间完成,每超 ...

  6. CF432D Prefixes and Suffixes

    CF432D Prefixes and Suffixes 题意 给你一个长度为n的长字符串,"完美子串"既是它的前缀也是它的后缀,求"完美子串"的个数且统计这些 ...

  7. 10.4.3反向迭代器Reverse_iterator笔记

    反向迭代器就是在容器中从尾元素向首元素反向移动的迭代器.对于反向携带器,递增(以及递减)操作的含义会颠倒过来.递增一个反向迭代器(++it)会移动到前一个元素:递减一个迭代器(--it)会移动到下一个 ...

  8. java程序员摸爬滚打的三年,这些经历你值得借鉴

    不知不觉都2020年2月底了,小羊同学从毕业快开始都一直从事java开发这个行业,前两天开通了头条号,想借此发文分享一下这几年的经历吧,如果你是还没毕业的大学生或者刚入行不久,也许会对你有帮助. 1: ...

  9. emoji大全_如何明智地使用emoji: &#128516;

    官网 https://www.webfx.com/tools/emoji-cheat-sheet/ emoji那么多,如何准确地使用到自己想要到呢?

  10. 2019HDU多校第一场1001 BLANK (DP)(HDU6578)

    2019HDU多校第一场1001 BLANK (DP) 题意:构造一个长度为n(n<=10)的序列,其中的值域为{0,1,2,3}存在m个限制条件,表示为 l r x意义为[L,R]区间里最多能 ...