博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JUC基本原理
阅读量:763 次
发布时间:2019-03-23

本文共 2774 字,大约阅读时间需要 9 分钟。

JUC基本原理

1.JUC简介

在这里插入图片描述
2.内存可见性
在这里插入图片描述
3.volatile关键字
在这里插入图片描述

package com.atguigu.juc;/* * 一、volatile 关键字:当多个线程进行操作共享数据时,可以保证内存中的数据可见。 * 					  相较于 synchronized 是一种较为轻量级的同步策略。 *  * 注意: * 1. volatile 不具备“互斥性” * 2. volatile 不能保证变量的“原子性” */public class TestVolatile {
public static void main(String[] args) {
ThreadDemo td = new ThreadDemo(); new Thread(td).start(); while(true){
if(td.isFlag()){
System.out.println("------------------"); break; } } }}class ThreadDemo implements Runnable {
private volatile boolean flag = false; @Override public void run() {
try {
Thread.sleep(200); } catch (InterruptedException e) {
} flag = true; System.out.println("flag=" + isFlag()); } public boolean isFlag() {
return flag; } public void setFlag(boolean flag) {
this.flag = flag; }}

在这里插入图片描述

4.CAS 算法
在这里插入图片描述
5.原子变量
在这里插入图片描述

package com.atguigu.juc;import java.util.concurrent.atomic.AtomicInteger;/* * 一、i++ 的原子性问题:i++ 的操作实际上分为三个步骤“读-改-写” * 		  int i = 10; * 		  i = i++; //10 *  * 		  int temp = i; * 		  i = i + 1; * 		  i = temp; *  * 二、原子变量:在 java.util.concurrent.atomic 包下提供了一些原子变量。 * 		1. volatile 保证内存可见性 * 		2. CAS(Compare-And-Swap) 算法保证数据变量的原子性 * 			CAS 算法是硬件对于并发操作的支持 * 			CAS 包含了三个操作数: * 			①内存值  V * 			②预估值  A * 			③更新值  B * 			当且仅当 V == A 时, V = B; 否则,不会执行任何操作。 */public class TestAtomicDemo {
public static void main(String[] args) {
AtomicDemo ad = new AtomicDemo(); for (int i = 0; i < 10; i++) {
new Thread(ad).start(); } } }class AtomicDemo implements Runnable{
// private volatile int serialNumber = 0; private AtomicInteger serialNumber = new AtomicInteger(0); @Override public void run() {
try {
Thread.sleep(200); } catch (InterruptedException e) {
} System.out.println(getSerialNumber()); } public int getSerialNumber(){
return serialNumber.getAndIncrement(); } }

6.模拟CAS算法

package com.atguigu.juc;/* * 模拟 CAS 算法 */public class TestCompareAndSwap {
public static void main(String[] args) {
final CompareAndSwap cas = new CompareAndSwap(); for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override public void run() {
int expectedValue = cas.get(); boolean b = cas.compareAndSet(expectedValue, (int)(Math.random() * 101)); System.out.println(b); } }).start(); } } }class CompareAndSwap{
private int value; //获取内存值 public synchronized int get(){
return value; } //比较 public synchronized int compareAndSwap(int expectedValue, int newValue){
int oldValue = value; if(oldValue == expectedValue){
this.value = newValue; } return oldValue; } //设置 public synchronized boolean compareAndSet(int expectedValue, int newValue){
return expectedValue == compareAndSwap(expectedValue, newValue); }}

转载地址:http://wfxzk.baihongyu.com/

你可能感兴趣的文章