并发同步

产生的原因的是:线程通信是通过分享数据和对象的访问,这就导致了两个问题:线程干涉和内存一执性错误。可以用来阻止这些错误的工具是同步。

然而,同步可能引入线程竞争,当两个或多个线程尝试去同时获取一个资源,并且导致虚拟机执行一个或多个线程更慢,或者甚至挂起他们的执行。

Starvation和livelock是线程竞争的形式。

同步主要讲:

线程干扰,描述当多个线程访问共享数据错误是如何引入的。

比如下面这个类:

class Counter {
    private int c = 0;

    public void increment() {
        c++;
    }

    public void decrement() {
        c--;
    }

    public int value() {
        return c;
    }

}
因为虚拟机对自增操作是分成三步的:


  1. Retrieve the current value of c.
  2. Increment the retrieved value by 1.
  3. Store the incremented value back in c.
所以,两个线程A,B的操作有可能是这样的:

Suppose Thread A invokes increment at about the same time Thread B invokes decrement. If the initial value of c is 0, their interleaved actions might follow this sequence:

  1. Thread A: Retrieve c.
  2. Thread B: Retrieve c.
  3. Thread A: Increment retrieved value; result is 1.
  4. Thread B: Decrement retrieved value; result is -1.
  5. Thread A: Store result in c; c is now 1.
  6. Thread B: Store result in c; c is now -1.
我们会发现,这样线程A的自增结果被丢失了,实际上是被B覆盖了。这些都是不可预期的,所以进程干扰的bug很难发现和修复。


内存一执性错误  描述由不兼容视角的共享内存导致的错误,就是在不同角度看共享内存,不一致的问题?

导致这个问题的原因很复杂,我们现在仅仅是需要知道 happen-before原则。

假设,int counter = 0;

A,B两个线程分享couter,A执行自增操作

counter++;

然后B打印counter

如果是在同一个进程执行,肯定是打印1 ,但是在不同的进程间,有可能是0.因为A的改变不能保证B能看见,除非程序员建立一个良好的happen-before关系在这两个语句间。

两个动作产生happer-before:

  • When a statement invokes Thread.start, every statement that has a happens-before relationship with that statement also has a happens-before relationship with every statement executed by the new thread. The effects of the code that led up to the creation of the new thread are visible to the new thread.
  • When a thread terminates and causes a Thread.join in another thread to return, then all the statements executed by the terminated thread have a happens-before relationship with all the statements following the successful join. The effects of the code in the thread are now visible to the thread that performed the join.

一个是,new Thread start之前的代码,比Thread中的先发生。

一个是调用Thread.join的线程的代码,先于执行join的这个进程。


然后我们可以使用Synchronized关键字,这个关键字两个用处

(1)如果一个线程执行这个方法,那么另一个线程就无法执行,只有等待第一个线程执行完成

(2)synchronized关键字自动建立happen-before,保证改变对所有线程可见。

但是有一个问题就是 liveness??  生命安全问题,比如死锁。






【从高压输电线的架空地线中汲取电能】一个25千瓦受控电源从735千伏线路的架空地线中汲取电能的SimPowerSystems模型(Simulink仿真实现)内容概要:本文介绍了一个基于SimPowerSystems的Simulink仿真模型,用于模拟从735千伏高压输电线的架空地线中汲取25千瓦电能的受控电源系统。该模型聚焦于高压输电线路中架空地线的能量回收技术,通过仿真手段实现对电能采集过程的建模与控制策略验证,体现了电力系统中新型能源获取方式的技术可行性与工程应用潜力。文中还提及该资源属于一系列电力系统仿真研究的一部分,涵盖微电网、储能优化、碳流追踪、鲁棒调度等多个前沿方向,配套提供Matlab/Simulink代码及网盘资料链接,便于科研人员复现与拓展研究。; 适合人群:具备电力系统基础知识、熟悉Matlab/Simulink仿真环境,从事电力工程、能源回收或智能电网相关研究的科研人员及研究生;有一定编程与建模仿真经验的高年级本科生或工程技术人员。; 使用场景及目标:①研究高压输电线路中架空地线的能量回收机制与建模方法;②掌握基于Simulink的电力系统仿真技术,特别是受控电源与电网交互的动态特性分析;③为开展能源 harvesting、分布式供能、电力电子变换器控制等相关课题提供参考模型与技术支撑; 阅读建议:建议结合提供的仿真模型文件进行实操演练,重点理解系统结构设计、参数设置与控制逻辑实现;同时可延伸学习文档中提到的其他电力系统优化与仿真案例,以拓宽研究视野和技术积累。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值