Java-----JUC

本文深入探讨了Java并发编程的核心概念,包括JUC包提供的工具类、线程池、轻量级任务框架及多线程上下文中的集合实现。解析了并发编程的三大特性:原子性、指令重排序和内存可见性,对比了synchronized和volatile关键字的使用场景与区别,详细阐述了CAS算法原理及其在无锁编程中的应用。

一、JUC概述

          在java5.0之后推出了java.util.concurrent(简称JUC)包,在此包中提供了很多在并发编程中使用的工具类,用于定义类似于

线程的自定义子系统,包括线程池,异步IO和轻量级任务框架,还提供了用于多线程上下文中的 Collection实现等。

并发编程中有三个特性:

                         原子性(互斥性) :  代码不可拆封,i++ 就不是原子操作,它可以拆分为三个步骤 temp1=i;

                                                                                                                                                            temp2=temp1+1;

                                                                                                                                                            i=temp2;

                         指令重排序:虚拟机在编译程序时,为了优化,可能不会按照你所写的代码循序执行

                         内存可见性:在多线程同时访问一个临界资源,当一个线程改变临界资源值的时候,其它线程要知道!

二、volatile

                          volatile 关键字: 当多个线程进行操作共享数据时,可以保证内存中的数据是可见的;相较于 synchronized 是一种

                                                   较为轻量级的同步策略;

                          volatile 不具备互斥性。

                          synchronizedvolatile的区别

                             synchronized可以保证原子性,内存可见性,但不能保证指令重排序。

                             voliatle可以保证内存可见性,禁止指令重排序,但不能保证原子性

public class MyThread implements Runnable{
    /* int  n=0;
    @Override
    public void run() {
        while (true){
            synchronized (this) {
                if(n>=10) {
                    break;
                }
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(n++);
            }
        }
    }*/

//下面使用的是原子变量操作  和上面n++效果相同
    private AtomicInteger ai = new AtomicInteger(0);  /创建这个类对象 初始值为1
    @Override
    public void run() {
        System.out.println(ai.getAndIncrement());//getAndIncrement()自增1
    }
}
//测试类
public class MyThreadTest{
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        for (int i=0;i<10;i++) {
            new Thread(myThread).start();
        }

    }
}

三、CAS算法

          是硬件对并发的支持,针对多处理器操作而设计的处理处理器中的一种操作指令,用于管理对共享数据的并发访问。

          CAS是一种无锁的非阻塞算法(乐观锁)的实现。   阻塞(同一时刻,只允许一个线程访问临界资源,加锁

                CAS 包含了三个操作数:

                              进行比较的旧预估值: A

                              需要读写的内存值: V

                              将写入的更新值: B

                              当且仅当 A == V 时, V = B, 否则,将不做任何操作,并且这个比较交换过程属于原子操作;

//模拟CAS算法
public class CompareAndSwapDemo {
	public static void main(String[] args) {
		CompareAndSwap compareAndSwap = new CompareAndSwap();
		for (int i = 0; i < 10; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {

					int expect = compareAndSwap.get();
					boolean b = compareAndSwap.compareAndSwap(expect, new Random().nextInt(101));
					System.out.println(b);
				}
			}).start();
		}
	}
}

class CompareAndSwap {
	private int value;

	/**
	 * 获取值
	 * 
	 * @return
	 */
	public synchronized int get() {
		return value;
	}

	public synchronized boolean compareAndSwap(int expect, int newValue) {
		if (this.value == expect) {
			this.value = newValue;
			return true;
		}
		return false;
	}
}

 

在CAS算法中,需要取出内存中某时刻的数据(由用户完成),在下一时刻比较并替换(由CPU完成,该操作是原子的)。这个时间差中,会导致数据的变化。
假设如下事件序列:
线程 1 从内存位置V中取出A。
线程 2 从位置V中取出A。
线程 2 进行了一些操作,将B写入位置V。
线程 2 将A再次写入位置V。
线程 1 进行CAS操作,发现位置V中仍然是A,操作成功。

尽管线程 1 的CAS操作成功,但不代表这个过程没有问题——对于线程 1 ,线程 2 的修改已经丢失。

CAS算法会出现ABA问题,为了解决这个问题可以增加版本号,记录更改次数(AtomicStampedReference)

//使用AtomicStampedReference解决ABA问题
public static void main(String[] args) {
        AtomicStampedReference asr = new AtomicStampedReference(1, 1);
        for (int i = 0; i < 50; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Object old = asr.getReference();  //获取旧值
                    int oldStamp = asr.getStamp();//获取版本号
                                                // 旧值     新值                   老的标记    新标记
                    boolean b = asr.compareAndSet(old,new Random().nextInt(1000), oldStamp,oldStamp+1);
                    System.out.println(b);
                }
            }).start();

        }
    }

 

本系统旨在构建一套面向高等院校的综合性教务管理平台,涵盖学生、教师及教务处三个核心角色的业务需求。系统设计着重于实现教学流程的规范化与数据处理的自动化,以提升日常教学管理工作的效率与准确性。 在面向学生的功能模块中,系统提供了课程选修服务,学生可依据培养方案选择相应课程,并生成个人专属的课表。成绩查询功能支持学生查阅个人各科目成绩,同时系统可自动计算并展示该课程的全班最高分、平均分、最低分以及学生在班级内的成绩排名。 教师端功能主要围绕课程与成绩管理展开。教师可发起课程设置申请,提交包括课程编码、课程名称、学分学时、课程概述在内的新课程信息,亦可对已开设课程的信息进行更新或撤销。在课程管理方面,教师具备录入所授课程期末考试成绩的权限,并可导出选修该课程的学生名单。 教务处作为管理中枢,拥有课程审批与教学统筹两大核心职能。课程设置审批模块负责处理教师提交的课程申请,管理员可根据教学计划与资源情况进行审核批复。教学安排模块则负责全局管控,包括管理所有学生的选课最终结果、生成包含学号、姓名、课程及成绩的正式成绩单,并能基于选课与成绩数据,统计各门课程的实际选课人数、最高分、最低分、平均分以及成绩合格的学生数量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值