1、volatile的原理

  1. 如何保持可见性:

    1)将当前处理器缓存行的数据写回到系统内存。
    2)这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据无效。

  2. 使用优化

使用volatile变量时,可以用一种追加字节的方式来优化队列出队和入队的性能

是不是在使用volatile变量时都应该追加到64字节呢?不是的。

例如场景:缓存行非64字节宽的处理器 ;

​ 共享变量不会被频繁地写。

2、Synchonized

Synchonized在JVM里的实现原理,JVM基于进入和退出Monitor对 象来实现方法同步和代码块同步。

synchronized用的锁是存在Java对象头里的。如果对象是数组类型,则虚拟机用3个字宽 (Word,即12 Bytes)存储对象头(Mark Word,存储到对象类型数据的指针、数组长度),如果对象是非数组类型,则用2字宽存储对象头。

的Mark Word里默认存储对象的HashCode、分代年龄和锁标记位。

3、无锁-偏向锁-轻量级锁-重量级锁

偏向锁:修改对象头Mark Word里的线程ID-----CAS操作

轻量级锁的加锁:线程复制Mark Word到栈,CAS尝试把Mark Word替换成指向锁记录的指针,成功则获得锁,失败则自旋,再失败则升级成重量级锁,阻塞。

轻量级锁的释放:CAS尝试把锁记录替换回对象头Mark Word里,成功则释放轻量级锁了,失败则释放锁(表示有竞争了)。

轻量级锁-->重量级锁:

  1. 另一个线程自旋获得锁失败,升级为重量级锁。

4、Java实现原子操作

  1. CAS

    存在三个问题:ABA(使用版本号:1A-2B-3A)、循环时间长浪费cpu时间、只能保证一个变量的原子操作(了AtomicReference类来保证引用对象之间的原子性,就可以把多个变量放在一个对 象里来进行CAS操作)。

  2. JVM内部实现了很多种锁 机制,有偏向锁、轻量级锁和互斥锁。有意思的是除了偏向锁,JVM实现锁的方式都用了循环 CAS。

(持续更新。。。)

Java并发编程的艺术· 笔记(1)的更多相关文章

  1. 多线程的通信和同步(Java并发编程的艺术--笔记)

    1. 线程间的通信机制 线程之间通信机制有两种: 共享内存.消息传递.   2. Java并发 Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式执行,通信的过程对于程序员来说是完全透 ...

  2. Java并发编程的艺术笔记(七)——CountDownLatch、CyclicBarrier详解

    一.等待多线程完成的CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作,像加强版的join.(t.join()是等待t线程完成) 例: (1)开启多个线程 ...

  3. Java并发编程的艺术笔记(五)——Java中的锁

    一.Lock接口的几个功能: 显示的获取和释放锁 尝试非阻塞的获取锁 能被中断的获取锁 超时获取锁 使用方式: Lock lock = new ReentrantLock(); lock.lock() ...

  4. Java并发编程的艺术笔记(九)——FutureTask详解

    FutureTask是一种可以取消的异步的计算任务.它的计算是通过Callable实现的,多用于耗时的计算. 一.FutureTask的三种状态 二.get()和cancel()执行示意 三.使用 一 ...

  5. Java并发编程的艺术笔记(三)——Thread.join()

    t.join()方法只会使主线程进入等待池并等待t线程执行完毕后才会被唤醒.并不影响同一时刻处在运行状态的其他线程.它能够使得t.join()中的t优先执行,当t执行完后才会执行其他线程.能够使得线程 ...

  6. Java并发编程的艺术笔记(二)——wait/notify机制

    一.概述 一个线程修改了一个对象的值,另一个线程感知到变化从而做出相应的操作.前者是生产者,后者是消费者. 等待/通知机制,是指一个线程A调用了对象O的wait()方法进入等待状态,而另一个线程B调用 ...

  7. Java并发编程的艺术笔记(一)——volatile和syncronized关键字

    一.线程间的通信 volatile和syncronized关键字 volatile 修饰变量,告知任何对该变量的访问必须从共享内存获取,对它的改变必须同步刷新至共享内存,由此保证可见性. syncro ...

  8. Java并发编程的艺术笔记(十)——Semaphore详解

    作用:控制同时访问某个特定资源的线程数量,用在流量控制.

  9. Java并发编程的艺术笔记(八)——线程池

    一.线程池的主要处理流程 ThreadPoolExecutor执行execute方法分下面4种情况. 1)如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(注意,执行这一步需要获 ...

随机推荐

  1. web框架实现购物车数量加减

    企业开发中经常是团队协作,每个人分配一个小的模块,比如说购物车模块,数量加减这一块人们首先想到的就是通过jquery实现,其实作为一个后端接口开发的程序猿也可以用自己更擅长的后端的逻辑代码来实现,那我 ...

  2. java:tomcat(负载均衡)nginx的应用配置

    http://mini.eastday.com/mobile/180627012211514.html 1.什么是负载均衡 由于系统各个核心部分随着业务量的提高,访问量和数据流量的快速增长,单一的服务 ...

  3. VS2015右键集成TortoiseGit

    先上效果 再说步骤 1.安装VS TortoiseGit等~~ 2.以外部工具方式调用TortoiseGit 3.在VS中设置右键菜单 在菜单栏下方右键,选择自定义 在弹出窗口中选择,命令->上 ...

  4. A Simple Chess (Lucas组合数 + 容斥)

    题意:走马步,要求向右向下,不能走进禁止的点.求方案数. 思路:若是n*m比较小的话,那么可以直接DP.但是这道题目不行.不过我们仔细分析可以知道从某个点到某个点是一个组合数,但是数据太大,mod值很 ...

  5. angular4 使用swiper 首次加载问题(一)

    angular 在使用外部插件swiper 还是有不少小坑的,下面来聊一聊.angular在使用swiper 的一些坑 一开始觉得使用外部引入的方式比较好,就在外部定义了.简单快捷方便, 但是在开发后 ...

  6. 使用 lsyncd 同步文件

    https://unix.stackexchange.com/questions/307046/real-time-file-synchronization https://github.com/ax ...

  7. Liunx网络技术管理及进程管理

    Linux网络技术管理及进程管理(week2_day4)   OSI七层模型和TCP/IP四层模型 OSI七层模型:OSI(Open System Interconnection)开放系统互连参考模型 ...

  8. 推荐!PlayGround:可视化神经网络

    https://cloud.tencent.com/developer/news/190352 http://playground.tensorflow.org PlayGround是一个在线演示.实 ...

  9. 5、Storm集成Kafka

    1.pom文件依赖 <!--storm相关jar --> <dependency> <groupId>org.apache.storm</groupId> ...

  10. \r \n \t \n\t

    [root@localhost advanced_shell_script]# cat test15.sh #!/bin/bash #!/bin/bash # echo -e# 默认情况下,echo命 ...