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();

        }
    }

 

Matlab基于粒子群优化算法及鲁棒MPPT控制器提高光伏并网的效率内容概要:本文围绕Matlab在电力系统优化与控制领域的应用展开,重点介绍了基于粒子群优化算法(PSO)和鲁棒MPPT控制器提升光伏并网效率的技术方案。通过Matlab代码实现,结合智能优化算法与先进控制策略,对光伏发电系统的最大功率点跟踪进行优化,有效提高了系统在不同光照条件下的能量转换效率和并网稳定性。同时,文档还涵盖了多种电力系统应用场景,如微电网调度、储能配置、鲁棒控制等,展示了Matlab在科研复现与工程仿真中的强大能力。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的高校研究生、科研人员及从事新能源系统开发的工程师;尤其适合关注光伏并网技术、智能优化算法应用与MPPT控制策略研究的专业人士。; 使用场景及目标:①利用粒子群算法优化光伏系统MPPT控制器参数,提升动态响应速度与稳态精度;②研究鲁棒控制策略在光伏并网系统中的抗干扰能力;③复现已发表的高水平论文(如EI、SCI)中的仿真案例,支撑科研项目与学术写作。; 阅读建议:建议结合文中提供的Matlab代码与Simulink模型进行实践操作,重点关注算法实现细节与系统参数设置,同时参考链接中的完整资源下载以获取更多复现实例,加深对优化算法与控制系统设计的理解。
### Java JUC AQS 并发编程 抽象队列同步器 使用教程 源码解析 #### 什么是AQS? `AbstractQueuedSynchronizer`(简称AQS),作为Java并发包中的核心组件之一,提供了用于实现锁和其他同步器的基础框架。它不仅简化了锁和同步工具的创建过程,还提高了这些工具的工作效率[^2]。 #### 类图结构与工作原理 AQS的设计围绕着一个FIFO(先进先出)等待队列展开,该队列由多个节点组成,每个节点代表了一个正在等待获取资源的线程。每当有新的竞争者未能立即获得所需资源时,就会被构造成一个新的节点并加入到这个队列之中;而当现有持有者释放其持有的资源之后,则会从队头开始依次唤醒后续等待者去尝试占有资源[^5]。 #### 同步模式分类 为了适应不同场景下的需求,AQS支持两种主要类型的同步方式——独占式以及共享式: - **独占式**:一次只允许单个线程访问临界区,在这种情况下其他任何试图进入同一区域内的请求都将被迫挂起直到前序操作完成为止; - **共享式**:允许多个读取者同时存在而不互相干扰,只要不存在写入动作发生即可保持一致性和安全性[^3]。 #### 自定义同步器的关键接口 对于想要利用AQS来构建特定行为逻辑的新类型而言,开发者通常需要重载以下几个抽象方法以适配具体的应用环境: - `tryAcquire(int arg)` 和 `tryRelease(int arg)` - `tryAcquireShared(int arg)` 及 `tryReleaseShared(int arg)` - `isHeldExclusively()` 上述函数分别对应于独占/共享模式下对资源的操作控制流程,通过合理地覆盖它们可以轻松打造出满足业务特性要求的各种高级别同步原语[^1]。 ```java public class CustomSync extends AbstractQueuedSynchronizer { protected boolean tryAcquire(int acquires) { // 实现具体的独占式获取逻辑 return super.tryAcquire(acquires); } protected boolean tryRelease(int releases) { // 实现具体的独占式释放逻辑 return super.tryRelease(releases); } } ``` #### 队列管理机制详解 在实际运行过程中,AQS内部维护了一条双向链表形式的数据结构用来存储各个待处理的任务单元。每当新成员到来之时便会调用`enqueue()`方法将其追加至末端位置上形成完整的链条关系网状链接,并且借助CAS指令保证整个插入过程的安全可靠性质不受外界因素影响破坏[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值