精华内容
下载资源
问答
  • 程序并发执行特征

    千次阅读 2020-10-13 22:14:34
    1:间断性:程序并发执行的时候,因为是共享资源,以及完成同一项任务而相互合作,致使在这些并发执行程序之间形成了相互制约的关系,导致程序执行呈现:执行--暂停--执行 2:失去封闭性:当系统中有多个并发...

    1:间断性:程序在并发执行的时候,因为是共享资源,以及完成同一项任务而相互合作,致使在这些并发执行的程序之间形成了相互制约的关系,导致程序执行呈现:执行--暂停--执行

    2:失去封闭性:当系统中有多个并发执行的程序时,各个资源是他们所共享的,这些资源的状态也由这些程序所改变,所以摸一个程序的运行环境会受到其他程序的影响。

    3:不可再生性

    展开全文
  • 失去了程序的封闭性 程序和机器执行过程的活动不在以一一对应 并发程序具有相互制约性
    1. 失去了程序的封闭性
    2. 程序和机器执行过程的活动不在以一一对应
    3. 并发程序间具有相互制约性
    展开全文
  • 四、 程序并发执行

    2020-05-23 16:59:52
    (当图中C1已经数据处理完毕时,I2还没有输入那么C2就得进入暂停,当使C2暂停的因素消失后(I2输入),程序继续执行)由此可见,相互制约将导致并发程序具有执行—暂停—执行”这种间断性的活动规律 失去封闭性:...

    宏观上看是多个程序同时执行,微观上看是多个程序分时占用CPU。这种程序的运行方式为并发执行。

    方法执行时的新特征:

    间断性:程序在比并发执行时,由于它们共享系统资源,以及为完成同一项任务而相互合作,致使在这些并发执行的程序之间形成了相互制约的关系。(当图中C1已经数据处理完毕时,I2还没有输入那么C2就得进入暂停,当使C2暂停的因素消失后(I2输入),程序继续执行)由此可见,相互制约将导致并发程序具有“执行—暂停—执行”这种间断性的活动规律

    失去封闭性:当系统中存在多个可以并发执行的程序时,系统中的各个资源将为它们做所共享,而这些资源的状态也有这些程序来改变,致使在其中任一程序在运行时,其环境都必然会收到其它程序的影响。Eg,当处理机已分配给某个进=进程运行时,其他的程序必须等待。

    不可再现性:当程序并发执行时,由于失去了封闭性,也导致失去了不可再现性。Eg,有两个循环程序A,B它们共享一个变量N。程序A每执行一次都要执行N=N+1操作,程序每执行一次都要print(N),然后把N置成0,程序AB以不同的速度运行。这样的话会出现三种不同的结果,多以程序在并发执行时,由于失去了封闭性,其计算结果必将与并发程序的执行速有关,从而使程序失去了可再现性。

    对并发执行的程序如果加以管理就能保证程序的可再现性

    展开全文
  • 并发_02_JAVA并发机制的底层实现原理

    万次阅读 2018-07-29 09:18:43
    一、并发编程中的三个概念 1.原子性 原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素...有序性:即程序执行的顺序按照代码的先后顺序执行 二、Volatile 它是轻量级的synchro...

    一、并发编程中的三个概念

    1.1 原子性

    • 原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。

    1.2 可见性

    • 可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

    1.3 有序性

    • 有序性:即程序执行的顺序按照代码的先后顺序执行

    二、Volatile

    它是轻量级的synchronized,比之执行成本更低,因为它不会引起线程的上下文切换,它在多处理器开发中保证了共享变量的“可见性”,“可见性”的意思是当一个线程修改一个变量时,另外一个线程能读到这个修改的值。

    2.1 volatile关键字的两层语义

    一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:

    • 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。

    • 2)禁止进行指令重排序。

    2.2 volatile的使用条件

    • Volatile 变量具有 synchronized 的可见性特性,但是不具备原子性。这就是说线程能够自动发现 volatile 变量的最新值。
      volatile不是线程安全的,单独使用 volatile 还不足以实现计数器、互斥锁或任何具有与多个变量相关的不变式(Invariants)的类

    • Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束
      在某些情况下,如果读操作远远大于写操作,volatile 变量还可以提供优于锁的性能优势

    要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:
    - 对变量的写操作不依赖于当前值。
    - 该变量没有包含在具有其他变量的不变式中

    2.3 被volatile修饰的变量,在被执行赋值操作时,它使用lock前缀的汇编指令,保证

    • 1,将当前处理器缓存行的数据写回到系统内存,

    • 2,这个写回内存的操作会使其在其他CPU里缓存了该内存地址数据无效,这样其它cpu再想获取到该值时,会重新从内存中读取数据

    上面两条规则,就是著名的“缓存一致性原则”

    2.4 volatile关键字禁止指令重排序有两层意思

    • 1)当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经对后面的操作可见;在其后面的操作肯定还没有进行;

    • 2)在进行指令优化时,不能将在对volatile变量访问的语句放在其后面执行,也不能把volatile变量后面的语句放到其前面执行。

    2.5 volatile的原理和实现机制

    前面讲述了源于volatile关键字的一些使用,下面我们来探讨一下volatile到底如何保证可见性和禁止指令重排序的。

    下面这段话摘自《深入理解Java虚拟机》:

    “观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令”

    lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:

    1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;

    2)它会强制将对缓存的修改操作立即写入主存;

    3)如果是写操作,它会导致其他CPU中对应的缓存行无效。

    三、Synchronized

    Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。

    3.1 Synchronized的作用

    主要有三个:

    • 确保线程互斥的访问同步代码
    • 保证共享变量的修改能够及时可见
    • 有效解决重排序问题。

    3.2 从语法上讲,Synchronized总共有三种用法

    • 1,修饰普通方法,锁是当前实例对象

    • 2,修饰静态方法,锁是当前类的class对象

    • 3,修饰代码块,锁是synchronized括号里配置的对象

    同步代码块是使用monitorenter和monitorexit指令实现的,每个对象都有一个monitor与之相关联,当且仅当它被持有后,它将处于锁定状态

    synchronized的锁存储在java对象头里面,锁一共有4中状态,依次是:无锁状态<偏向锁状态<轻量级锁状态<重量级锁状态, 另外随着竞争情况,锁会升级,而且升级后不能降级,这样做是为了保证获得锁和释放锁的效率.

    偏向锁: 现实中锁不仅不存在多线程竞争,而且总是被同一个线程获得,为了降低线程获得锁的开销,引入偏向锁。偏向锁的撤销只有当竞争出现的时候才会发生。

    轻量级锁:通过CAS自旋的方式,没有获取资源的线程不必阻塞,也就不会有上下文的切换,从而降低了开销,但是CAS自旋也是消耗CPU的,所以轻量级锁使用于同步块执行速度快,锁的持有时间比较短的情况,响应速度比较快

    重量级锁:线程之间竞争不存在自旋的情况,直接阻塞,上下文切换,系统开销比较大,适用于同步块所需要的时间比较久的情况,系统吞吐量比较大

    3.3 总结

    Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到内核态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。

    因此,这种依赖于操作系统Mutex Lock所实现的锁我们称之为“重量级锁”。JDK中对Synchronized做的种种优化,其核心都是为了减少这种重量级锁的使用。JDK1.6以后,为了减少获得锁和释放锁所带来的性能消耗,提高性能,引入了“偏向锁”和“轻量级锁”。无锁 –> 偏向锁 –> 轻量级 –> 重量级

    四、原子操作的实现原理

    4.1 理解几个术语

    1,缓存行,cache line,缓存的最小操作单位

    2,比较并交换,compare and exchange, CAS操作需要输入两个值,一个old value(也是expected value),一个new value,在操作期间,如果旧值发生了变化,则新值不会交换,这个就是为了解决例如 i++这种情况的,i读取,i++, i被赋值,但是如果多个线程同时访问这个i值,则下一个线程读取到的可能是脏数据,这时候新值就不该被赋给变量,自旋CAS的实现原理就是,当这种情况发生时,放弃赋值,重新尝试,直到成功为止

    3,CPU流水线,一条指令被分解成多个步骤,每个步骤在不同的电器元件上执行,类似于车间流水线,这样可以提高效率

    4,内存顺序冲突,这个概念我稍微有点疑惑,它是由假共享引起的,是指多个CPU同时修改一个缓存行的不同部分引起其中一个CPU的操作无效,当出现这种情况时,CPU流水线会被清空,这个清空我自己的理解是说,后续指令需要依赖前面指令才能成功,如果前面缓存更新失效了,后续指令需要重新执行

    4.2 原子操作实现

    处理器如何实现原子操作

    1,总线加锁实现原子操作

    2,缓存加锁实现原子操作

    Java如何实现原子操作呢

    1,使用循环CAS实现原子操作

    2,使用锁实现原子操作

    下面附上一段循环CAS代码

    public class AtomicJava {
    
        private static AtomicInteger atomicI = new AtomicInteger();
        private static int i = 0;
    
        public void count(){
    
            /* 自旋CAS(compareAndSet)的基本思路就是循环进行CAS操作直到成功为止
             * atomicI.getAndIncrement();
              public final int getAndIncrement() {
                    for (;;) {//
                        int current = get();
                        int next = current + 1;// current和next不存在被竞争的情况,但是get()获取到执行compareAndSet之间,很可能原值已经被其它线程改变了
                        if (compareAndSet(current, next))
                            return current;
                    }
                }*/
        }
    
        public static void main(String[] args){
            final AtomicJava counter=new AtomicJava();
            List<Thread> list=new ArrayList<Thread>();
            for(int i=0;i<100;i++){
                Thread t=new Thread(new Runnable(){
                    @Override
                    public void run() {
                        for(int j=0;j<1000;j++){
                        counter.safeCount();
                        counter.unSafeCount();
                        }
                    }
                });
                list.add(t);
    
            }
            for(Thread t:list){
                t.start();
            }
    
            try {
                Thread.sleep(1000);
                for (Thread t : list) {
                    t.join();
                }
                System.out.println("Unsafe count: "+i);
                System.out.println("Safe count: "+atomicI.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 使用CAS实现线程安全计数器
         */
        private void safeCount() {
            for (;;) {
                int i = atomicI.get();
                boolean suc = atomicI.compareAndSet(i, ++i);
                if(suc)
                    return;
            }
        }
    
        /**
         * 非线程安全的count
         */
        private void unSafeCount(){
            i++;
        }
    }
    展开全文
  • 并发_01_并发性与多线程介绍

    万次阅读 2018-07-18 08:20:26
    在过去单 CPU 时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个 CPU,并交由...
  • C++并发实战9:unique_lock

    万次阅读 2013-12-11 16:36:31
    //若unique_lock对象拥有管理的mutex的所有权,mutex没有被销毁或者unlock,那么将执行mutex::unlock()解锁,并不销毁mutex对象。 mutex_type* mutex() const noexcept;//返回unique_lock管理的mutex指针,但是unique...
  • 在演示程序里,我定义了两个方法,分别是请求百度和请求新浪,我希望让这两个请求再我自定义的线程池中执行。其中用到的spring-web中的restTemplate来做请求,在具体方法中打印出当前执行的线程(为线程取名是很重要...
  • JAVA_API1.6文档(中文)

    万次下载 热门讨论 2010-04-12 13:31:34
    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...
  • 用户可以直接干预作业的运行,具有交互性 C、 提高了单位时间内的处理能力  D、 提高了系统的吞吐率 3、 以下( )项功能不是操作系统具备的主要功能。 A.内存管理 B.中断处理  C.文档编辑 D....
  • JAVA并发编程1_多线程的实现方式

    千次阅读 2015-05-14 18:09:57
    JAVA中创建线程的两种方式:继承Thread或实现Runnable接口。 1 继承Thread类,重写run方法: /** ...出现这样的结果就是因为多线程并发的不可控性,关于线程同步这个问题会在后面继续探讨。
  • ThreadPool有两个设置线程池并发数量的方法,分别是: ThreadPool.SetMinThreads(int workerThreads, int completionPortThreads)//设置最小线程并发数 ThreadPool.SetMaxThreads(int workerThreads, int ...
  • 什么是并发执行

    千次阅读 2016-08-29 21:55:53
    1、并发运行就是让计算机同时运行几个程序或同时运行同一程序多个进程或线程。 2、早期的计算机只具有一个中央处理器(CPU)并且是单核(只有一个运算器)的,这种情况下计算机操作系统采用并发技术实现并发运行,...
  • C++11中thread_local的使用

    千次阅读 2020-09-20 12:51:46
    存储期定义C++程序中变量/函数的范围(可见性)和生命周期。C++程序中可用的存储期包括auto、register、static、extern、mutable和thread_local。这些说明符放置在它们所修饰的类型之前。 线程局部存储(Thread Local ...
  • 使用ngx_lua构建高并发应用(1)

    万次阅读 多人点赞 2012-02-29 14:18:27
     Nginx是一个高性能,支持高并发的,轻量级的web服务器。目前,Apache依然web服务器中的老大,但是在全球前1000大的web服务器中,Nginx的份额为22.4%。Nginx采用模块化的架构,官方版本的Nginx中大部分功能都是通过...
  • 本章描述如何在Flink中配置程序并发执行,一个Flink程序可以由不同的task(如:transformations/opterators,data sources及data sinks等)组成,一个task会分发到多个并发实例中运行,并且每个并发实例处理task的部分...
  • 探究PCB 的构成——task_struct结构体

    千次阅读 2018-06-25 21:04:18
    进程控制块是操作系统核心的一种数据结构,主要用来表示进程的状态,它能够使程序成为一个能够独立运行的基本单位,并且可以并发执行的进程。也就是说,系统是根据PCB来对并发执行的进程进行控制和管理。PCB中通常...
  • 并发程序的测试 编写并发程序时候,可以采取和串行程序相同的编程方式。唯一的难点在于,并发程序存在不确定性,这种不确定性会令程序出错的地方远比串行程序多,出现的方式也没有固定规则。这对程序的应用会造成...
  • 并发编程面试题(2020最新版)

    万次阅读 多人点赞 2020-03-14 17:28:01
    文章目录基础知识并发编程的优缺点为什么要使用并发编程(并发编程的优点)并发编程有什么缺点并发编程三要素是什么?在 Java 程序中怎么保证多线程的运行安全?并行和并发有什么区别?什么是多线程,多线程的优劣?...
  • MySQL - SELECT LAST_INSERT_ID() 使用总结

    万次阅读 2019-03-27 16:22:36
    语句中引用 ,该行将行插入到具有自己 AUTO_INCREMENT 列的表中 。 LAST_INSERT_ID() 第二个陈述中的价值 将保持稳定; 它的第二行和后一行的值不受先前行插入的影响。(但是,如果将参考混合到 LAST_INSERT_ID()...
  • 进程的并发执行 处理器利用率计算 并发程序设计 把一个具体问题求解设计成若干个可同时执行的程序模块的方法 特性: 无关与交往的并发进程 与时间有关的错误 进程互斥与进程同步 互斥与临界区 PV操作与进程互斥 ...
  • lock的代码段越少,执行越快,整个程序的运行效率越高。 a.锁住的代码少,叫做粒度细,执行效率高; b.锁住的代码多,叫做粒度粗,执行效率低; 4.unique_lock所有权的传递 unique_lock myUniLock(myMutex);把...
  • 究其原因一是LR本身存在对测试环境的兼容性问题导致录制失败,更深层次的原因是录制者不清楚LR录制脚本的原理,或者不清楚客户端与服务器端之间的请求和应答内容及通信方式,导致一旦出现脚本执行失败便无从下手。...
  • 程序出链接错误的时候,经常看到lnk errorxxx:某某函数、某某变量找不到等等,里面的函数名通常都很难看明白,因为使用的是修饰名。 C 和 C++ 程序中的函数在内部通过其修饰名加以识别。修饰名是在编译函数定义或...
  • 每次mysql_query操作在mysql服务器上可以理解为一次“原子”操作, 写操作常常需要锁表的, 是mysql应用服务器锁表不是我们的应用程序锁表。 值得注意的是,如果你一次插入了多条记录,这个函数返回的是第一个...
  • 上一篇谈了对未来并发程序的一些预想,今天来谈谈如何在并发程序中运用Transaction Object实现无锁并发。 Transaction Object这一概念来自于数据库,现在的数据库一般都能很好的支持并发访问,对于只读数据来说天生...
  • web压测工具http_load原理分析

    千次阅读 2014-11-16 16:11:04
    程序的工作流程可以用下面这幅图来表示,执行程序主要环节位于流程图中的循环内。http_load为单一进程的程序,因此进程内的所有调用都是非阻塞方式进行, 保证程序的流畅度。程序执行过程主体在一个大循环当中,...
  • CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。 这种模式一般和php配合一起使用所以我们首先要安装php  3.1、php安装(本人安装的是php-7.3.1) 3.1.1、php下载 进入...
  • IOCP 实现一个简单高并发服务器程序

    千次阅读 2014-01-03 10:49:13
    意思是,具有不正确号的内存被保存备用,并且因为性能原因,我们将内存保存在希哈表中(例如 m_SendBufferMap和m_ReadBufferMap )。 要想得到更多这个方案的信息,请查看源代码,并在IOCPS类中查看下面的函数: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 243,092
精华内容 97,236
关键字:

并发执行的程序具有_____特征