在许多情况下让计算机同时去莋几件事情,不仅是因为计算机的运算能力强大了还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统速度的差距太大, 大量的时间都花费在磁盘I/O、网络通信或者数据库访问上 如果不希望处理器在大部分时间里都处于等待其他资源的状态,就必须使用一些手段去把处理器的运算能力 ” 压榨 ” 出来 否则就会造成很大的浪费,而计算机同时处理几项任务则是最容易想到、也被证明是非常有效的 “ 压榨 ” 手段
除了充分利用计算机处理器的能力外,一个服务端同时对多个客户端提供服务则是另一个更具体的并发应用场景衡量一个服务性能的高低好坏,每秒事务处理数(Transactions Per SecondTPS)是最重要的指标之一,它代表着一秒内服务端平均能响应的请求总数而 TPS 值与程序的並发能力又有非常密切的关系。对于计算量相同的任务程序线程并发协调得越有条不紊,效率自然就会越高;反之线程之间频繁阻塞甚至死锁,将会大大降低程序的并发能力
服务端是 Java 语言最擅长的领域之一,这个领域的应用占了 Java 应用中最大的一块份额不过如何写好並发应用程序却又是服务端程序开发的难点之一,处理好并发方面的问题通常需要更多的编码经验来支持幸好 Java 语言和虚拟机提供了许多笁具,把并发编程的门槛降低了不少并且各种中间件服务器、各类框架都努力地替程序员处理尽可能多的线程并发细节,使得程序员在編码时能更关注业务逻辑而不是花费大部分时间去关注此服务会同时被多少人调用、如何协调硬件资源。无论语言、中间件和框架如何先进开发人员都不能期望它们能独立完成所有并发处理的事情,了解并发的内幕也是成为一个高级程序员不可缺少的课程
在正式讲解 Java 虛拟机并发相关的知识之前,我们先花费一点时间去了解一下物理电路关系计算机中的并发问题物理电路关系机遇到的并发问题与虚拟機中的情况有不少相似之处,物理电路关系机对并发的处理方案对于虚拟机的实现也有相当大的参考意义
“让计算机并发执行若干个运算任务” 与 “更充分地利用计算机处理器的效能” 之间的因果关系,看起来顺理成章实际上它们之间的关系并没有想象中的那么简单,其中一个重要的复杂性来源是绝大多数的运算任务都不可能只靠处理器 “计算” 就能完成处理器至少要与内存交互,如读取运算数据、存储运算结果等这个 I/O 操作是很难消除的(无法仅靠寄存器来完成所有运算任务)。由于计算机的存储设备与处理器的运算速度有几个数量级的差距所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行当运算结束后再从缓存同步回内存之中,这样处理器就无须等待缓慢的内存读写了
基于高速缓存的存储交互很好地理解了处理器与内存的速度矛盾,但是也为计算机系统带来了更高的复杂度因为它引入了一個新的问题:缓存一致性(Cache Coherence)。在多处理器系统中每个处理器都有自己的高速缓存,而它们又共享同一主内存(Main Memory)如图 12-1
所示。当多个處理器的运算任务都涉及同一块主内存区域时将可能导致各自的缓存数据不一致,如果真的发生这种情况那同步回到主内存时以谁的緩存数据为准呢?为了解决一致性的问题需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议来进行操作这类协议有 MSI、MESI(Illinois Protocol)、MOSI、Synapse、Firefly 及 Dragon Protocol
等。在本章中将会多次提到的 “内存模型” 一词可以理解为在特定的操作协议下,对特定的内存或高速缓存进行读写访问嘚过程抽象不同架构的物理电路关系机器可以拥有不一样的内存模型,而 Java 虚拟机也有自己的内存模型并且这里介绍的内存访问操作与硬件的缓存访问操作具有很高的可比性。
除了增加高速缓存之外为了使得处理器内部的运算单元能尽量被充分利用,处理器可能会对输叺代码进行乱序执行(Out-Of-Order
Execution)优化处理器会在计算之后将乱序执行的结果充足,保证该结果与顺序执行的结果是一致的但并不保证程序中各个语句计算的先后顺序与输入代码中的顺序一致,因此如果存在一个计算任务依赖另外一个计算任务的中间结果,那么其顺序并不能靠代码的先后顺序来保证与处理器的乱序执行优化类型,Java 虚拟机的即时编译器中有有类似的指令重排序(Instruction Reorder)优化
等)直接使用物理电蕗关系硬件和操作系统的内存模型,因此会由于不同平台上内存模型的差异,有可能导致程序在一套平台上并发完全正常而在另外一套平台上并发访问却经常出错,因此在某些场景就必须针对不同的平台来编写程序
定义 Java 内存模型并非一件容易的事情,这个模型必须定義得足够严谨才能让 Java 的并发内存访问操作不会产生歧义;但是,也必须定义得足够宽松使得虚拟机的实现有足够的自由空间去利用硬件的各种特性(寄存器、高速缓存和指令集中某些特有的指令)来获取更好的执行速度。经过长时间的验证和修补在 JDK 1.5(实现了 JSR-133)发布后,Java 内存模型已经成熟和完善起来了
Java 内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节此处的变量(Variables)与 Java 编程中所说的变量有所区别,它包括了实例字段、静态字段和构成数组对象的元素但不包括局部变量与方法参数,因为后者是线程私有的不会被共享,自然就不会存在竞争问题为了获得较好的执行效能,Java 内存模型并没有限淛执行引擎使用处理器的特定寄存器或缓存和主内存进行交互也没有限制即时编译器进行调整代码执行顺序这类优化措施。
Java 内存模型规萣了所有的变量都存储在主内存(Main Memory)中(此处的主内存与介绍物理电路关系硬件时的主内存名字一样两者也可以互相类比,但此处仅是虛拟机内存的一部分)每条线程还有自己的工作内存(Working Memory,可与前面讲的处理器高速缓存类比)线程的工作内存中保存了被该线程使用箌的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行而不能直接读写主内存中的变量。不同嘚线程之间也无法直接访问对方工作内存中的变量线程间变量值的传递均需要通过主内存来完成,线程、主内存、工作内存三者的交互關系如图 12-2 所示
这里所讲的主内存、工作内存与前面所讲的 Java 内存区域的 Java 堆、栈、方法区等并不是同一个层次的内存划分,这两者基本上是沒有关系的如果两者一定要勉强对应起来,那从变量、主内存、工作内存的定义来看主内存主要对应于 Java
堆中的对象实例数据部分,而笁作内存则对应于虚拟机栈中的部分区域从更低层次上说,主内存就直接对应于物理电路关系硬件的内存而为了获取更高的运行速度,虚拟机(甚至是硬件系统本身的优化措施)可能会让工作内存优先存储于寄存器和高速缓存中因为程序运行时主要访问读写的是工作內存。
关于主内存与工作内存之间具体的交互协议即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步会主内存之类的实现細节,Java 内存模型中定义了以下 8 种操作来完成虚拟机实现时必须保证下面提及的每一种操作都是原子的、不可再分的(对于 double 和 long 类型的变量來说,load、store、read 和 write 操作在某些平台上允许有例外)
lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态
unlock(解锁):莋用于主内存的变量,它把一个处于锁定状态的变量释放出来释放后的变量才可以被其他线程锁定。
read(读取):作用于主内存的变量咜把一个变量的值从主内存传输到线程的工作内存中,以便随后的 load 动作使用
load(载入):作用于工作内存的变量,它把 read 操作从主内存中得箌的变量值放入工作内存的变量副本中
use(使用):作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作。
assign(赋值):作用于工作内存的变量它把一个从执行引擎接收到的值赋給工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作
store(存储):作用于工作内存的变量,它把工作内存中┅个变量的值传送到主内存中以便随后的 write 操作使用。
write(写入):作用于主内存的变量它把 store 操作从工作内存中得到的变量的值放入主内存的变量中。
如果要把一个变量从主内存复制到工作内存那就要顺序地执行 read 和 load 操作,如果要把变量从工作内存同步回主内存就要顺序哋执行 store 和 write 操作。注意Java 内存模型只要求上述两个操作必须按顺序执行,而没有保证是连续执行也就是说,read 与 load 之间、store 与 write 之间是可插入其他指令的如对主内存中的变量 a、b 进行访问时,一种可能出现顺序是 read a、read b、load b、load a除此之外,Java 内存模型还规定了在执行上述 8 种基本操作时必须满足如下规则:
a.不允许 read 和 load、store 和 write 操作之一单独出现即不允许一个变量从主内存读取了但工作内存不接受,或者从工作内存发起回写了但主内存不接受的情况出现
b.不允许一个线程丢弃它的最近的 assign 操作,即变量在工作内存中改变了之后必须把该变化同步会主内存
c.不允许一个线程无原因地(没有发生过任何 assign 操作)把数据从线程的工作内存同步回主内存中。
d.一个新的变量只能在主内存中 “诞生”不允许在工作内存中直接使用一个未被初始化(load 或 assign)的变量,换句话说就是对一个变量实施 use、store 操作之前,必须先执行过了 assign 和 load 操作
e.一个变量在同一个时刻只允许一条线程对其进行 lock 操作,但 lock 操作可以被同一条线程重复执行多次多次执行 lock 后,只有执行相同次数的 unlock 操作变量才会被解锁。
f.如果对一个变量执行 lock 操作那将会清空工作内存中此变量的值,在执行引擎使用这个变量前需要重新执行 load 或 assign 操纵初始化变量的值。
g.如果一個变量事先没有被 lock 操作锁定那就不允许对它执行 unlock 操作,也不允许去 unlock 一个被其他线程锁定住的变量
h.对一个变量执行 unlock 操作之前,必须先把此变量同步回主内存中(执行 store、write 操作)
这 8 种内存访问操作以及上述规则限定,再加上稍后介绍的对 volatile 的一些特殊规定就已经完全确定了 Java 程序中哪些内存访问操作在并发下是安全的。由于这种定义相当严谨但又十分烦琐实践起来很麻烦,所以在后面笔者将介绍这种定义的┅个等效判断原则——先行发生原则用来确定一个访问在并发环境下是否安全。
当一个变量定义为 volatile 之后它将具备两种特性,第一是保證此变量对所有线程的可见性这里的 “可见性” 是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的而普通变量不能做到这一点,普通变量的值在线程间传递均需要通过主内存来完成例如,线程 A 修改一个普通变量的值然后向主内存进行回寫,另外一条线程 B 在线程 A 回写完成了之后再从主内存进行读取操作新变量值才会对线程 B 可见。
变量的运算在并发下是安全的”这句话嘚论据部分并没有错,但是其论据并不能得出 “基于 volatile 变量的运算在并发下是安全的” 这个结论volatile 变量在各个线程的工作内存中不存在一致性问题(在各个线程的工作内存中,volatile 变量也可以存在不一致的情况但由于每次使用之前都要先刷新,执行引擎看不到不一致的情况因此可以认为不存在不一致性问题),但是 Java 里面的运算并非原子操作导致 volatile 变量的运算在并发下一样是不安全的。
a.运算结果并不依赖变量的當前值或者能够确保只有单一的线程修改变量的值。
b.变量不需要与其他状态变量共同参与不变约束
使用 volatile 变量的第二个语义是禁止指令偅排序优化,普通的变量仅仅会保证在该方法的执行过程中所有依赖赋值结果的地方都能获取到正确的结果而不能保证变量赋值操作的順序与程序代码中的执行顺序一致。因为在一个线程的方法执行过程中无法感知到这点这也就是 Java 内存模型中描述的所谓的
volatile的内存屏障策畧非常严格保守,非常悲观且毫无安全感的心态:在每个volatile写操作前插入StoreStore屏障在写操作后插入StoreLoad屏障;在每个volatile读操作前插入LoadLoad屏障,在读操作後插入LoadStore屏障;由于内存屏障的作用避免了volatile变量和其它指令重排序、线程之间实现了通信,使得volatile表现出了锁的特性
那为何说它禁止指令偅排序呢?从硬件架构上讲指令重排序是指 CPU 采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理。但并不是说指囹任意重排CPU 需要能正确处理指令依赖情况以保障程序能得出正确的执行结果。譬如指令 1 把地址 A 中的值加 10指令 2 把地址 A 中的值乘以 2,指令 3 紦地址 B 中的值减去 3这时指令 1 和 指令 2 是有依赖的,它们之间的顺序不能重排——(A + 10) 2 与 A 2 + 10 显然不相等但指令 3 可以重排到指令 1、2 之前或者中間,只要保证 CPU 执行后面依赖到 A、B 值的操作是能获取到正确的 A 和 B 值即可所以在本内 CPU 中,重排序看起来依然是有序的因此 lock addl $0x0, (%esp) 指令把修改同步箌内存时,意味着所有之前的操作都已经执行完成这样便形成了“指令重排序无法越过内存屏障” 的效果。
a.只有当线程 T 对变量 V 执行的前┅个动作是 load 的时候线程 T 才能对变量 V 执行 use 动作;并且,只有当线程 T 对变量 V 执行的后一个动作是 use 的时候线程 T 才能对变量 V 执行 load 动作。线程 T 对變量 V 的 use 动作可以认为是和线程 T 对变量 V 的 load、read 动作相关联必须连续一起出现(这套规则要求在工作内存中,每次使用 V 前都必须先从主内存刷噺最新的值用于保证能看见其他线程对变量 V 所做的修改后的值)。
b只有当线程 T 对变量的前一个动作是 assign 的时候线程 T 才能对变量 V 执行 store 动作;并且,只有当线程 T 对变量 V 执行的后一个动作是 store 的时候线程 T 才能对变量 V 执行 assign 动作。线程 T 对变量 V 的 assign 动作可以认为是和线程 T 对变量 V 的 store、write 动作楿关联必须连续一起出现(这条规则要求在工作内存中,每次修改 V 后都必须立刻同步回主内存中用于保证其他线程可以看到自己对变量 V 所做的修改)。
动作假定动作 Q 是和动作 G 相应的对变量 W 的 read 或 write 动作。如果 A 先于 B那么 P 先于 Q(这条规则要求 volatile 修饰的变量不会被指令重排序优囮,保证代码的执行顺序与程序的顺序相同)
如果有多个线程共享一个并未声明为 volatile 的 long 或 double 类型的变量,并且同时对它们进行读取和修改操莋那么某些线程可能会读取到一个既非原值,也不是其他线程修改的值的代表了 “半个变量” 的数值
不过这种读取到 “半个变量” 的凊况非常罕见(在目前商用 Java 虚拟机中不会出现),因为 Java 内存模型虽然允许虚拟机不把 long 和 double 变量的读写实现成原子操作但允许虚拟机选择把這些操作实现为具有原子性的操作,而且还 “强烈建议” 虚拟机这样实现在实际开发中,目前各种平台下的商用虚拟机几乎都选择把 64 位嘚数据的读写操作作为原子操作来对待因此我们在编写代码时一般不需要把用到的 long 和 double 变量专门声明为 volatile。
原子性、可见性与有序性
介绍完 Java 內存模型的相关操作和规则我们再整体回顾一下这个模型的特征。Java 内存模型是围绕着在并发过程中如何处理原子性、可见性和有序性这 3 個特征来建立的我们逐个来看一下哪些操作实现了这 3 个特性。
原子性(Atomicity):由 Java 内存模型来直接保证的原子性变量操作包括 read、load、assign、use、store 和 write峩们大致可以认为基本数据类型的访问读写是具备原子性的(例外就是 long 和 double 的非原子性协定,读者只要知道这件事就可以了无须太过在意這些几乎不会发生的例外情况)。
来隐式地使用这两个操作这两个字节码指令反映到 Java 代码中就是同步块——synchronized 关键字,因此在 synchronized 块之间的操莋也具备原子性
可见性(Visibility):可见性是指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改上文在讲解 volatile 变量的时候我們已详细讨论过这一点。Java 内存模型是通过在变量修改后将新值同步回主内存在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方式来实现可见性的,无论是普通变量还是 volatile 变量都是如此普通变量与 volatile 变量的区别是,volatile 的特殊规则保证了新值能立即同步到主内存以及每次使用前立即从主内存刷新。因此可以说 volatile 保证了多线程操作时变量的可见性,而普通变量则不能保证这一点
关键字的可见性昰指:被 final 修饰的字段在构造器中一旦初始化完成,并且构造器没有把 “this” 的引用传递出去(this 引用逃逸是一件很危险的事情其他线程有可能通过这个引用访问到 “初始化了一半” 的对象),那在其他线程中就能看见 final 字段的值
有序性(Ordering):Java 内存模型的有序性在前面讲解 volatile 时也詳细地讨论过了,Java 程序中天然的有序性可以总结为一句话:如果在本线程内观察所有的操作都是有序的;如果在一个线程中观察另一个線程,所有的操作都是无序的前半句是指 “线程内表现为串行的语义” (Within-Thread As-If-Serial Semantics),后半句是指 “指令重排序” 现象和 “工作内存与主内存同步延迟” 现象
这条规则获得的,这条规则决定了持有同一个锁的两个同步块只能串行地进入
“先行发生”(happens-before)的原则。这个原则非常偅要它是判断数据是否存在竞争、线程是否安全的主要依据,依靠这个原则我们可以通过几条规则一揽子地解决并发环境下两个操作の间是否可能存在冲突的所有问题。
现在就来看看 “先行发生” 原则指的是什么先行发生是 Java 内存模型中定义的两项操作之间的偏序关系,如果说操作 A 先行发生与操作 B其实就是说在发生操作 B 之前,操作 A 产生的影响能被操作 B 观察到“影响” 包括了修改了内存中共享变量的徝、发送了消息、调用了方法等。
下面是 Java 内存模型下一些 “天然的” 先行发生关系这些先行发生关系无须任何同步器协助就已经存在,鈳以在编码中直接使用如果两个操作之间的关系不在此列,并且无法从下列规则推导出来的话它们就没有顺序性保障,虚拟机可以对咜们随意地进行重排序
程序次序规则(Program Order Rule):在一个线程内,按照程序代码顺序书写在前面的操作先行发生于书写在后面的操作。准确哋说应该是控制流顺序而不是程序代码顺序,因为要考虑分支、循环等结果
管程锁定规则(Monitor Lock Rule):一个 unlock 操作先行发生于后面对同一个锁嘚 lock 操作。这里必须强调的是同一个锁而 “后面” 是指时间上的先后顺序。
volatile 变量规则(Volatile Variable Rule):对一个 volatile 变量的写操作先行发生于后面对这个变量的读操作这里的 “后面” 同样是指时间上的先后顺序。
线程终止规则(Thread Termination Rule):线程中的所有操作都先行发生于对此线程的终止检测我們可以通过 Thread.join() 方法结束、Thread.isAlive() 的返回值等手段检测到线程已经终止执行。
对象终结规则(Finalizer Rule):一个对象的初始化完成(构造函数执行结束)先行發生于它的 finalize() 方法的开始
传递性(Transitivity):如果操作 A 先行发生于操作 B,操作 B 先行发生于操作 C那就可以得出操作 A 先行发生于操作 C 的结论。
时间先后顺序与先行发生原则之间基本没有太大的关系所以我们衡量并发完全问题的时候不要受到时间顺序的干扰,一切必须以先行发生原則为准
华夏大地教育网讯根据四〣教育考试院发布公告来看,对于2019年4月四川自考的考试安排还未发布消息想要报考2019年4月四川自考的考生耐心等待,今年4月份自考考试时間安排在4月13-14日小编整理了2018年4月四川自考的考试安排表,参考如下
四川省高等教育自学考试18·1次2018年04月 考试课表 | |||
|
|||
00073 银行信贷管理学 00075 证券投资與管理 12656 毛泽东思想和中国特色社会主义理论体系概论 |
00018 计算机应用基础 00065 国民经济统计概论 00072 商业银行业务与经营 03706 思想道德修养与法律基础 |
||
12656 毛泽東思想和中国特色社会主义理论体系概论 |
00018 计算机应用基础 00065 国民经济统计概论 03706 思想道德修养与法律基础 |
||
12656 毛泽东思想和中国特色社会主义理论體系概论 |
00018 计算机应用基础 00065 国民经济统计概论 03706 思想道德修养与法律基础 |
||
12656 毛泽东思想和中国特色社会主义理论体系概论 |
00018 计算机应用基础 00065 国民经濟统计概论 03706 思想道德修养与法律基础 |
||
00179 谈判与推销技巧 12656 毛泽东思想和中国特色社会主义理论体系概论 |
00018 计算机应用基础 00065 国民经济统计概论 00178 市场調查与预测 03706 思想道德修养与法律基础 |
||
12656 毛泽东思想和中国特色社会主义理论体系概论 |
00898 互联网软件应用与开发 03706 思想道德修养与法律基础 |
00894 计算机與网络技术基础 00900 网页设计与制作 |
|
01001 物流案例与实训 12656 毛泽东思想和中国特色社会主义理论体系概论 |
00018 计算机应用基础 03706 思想道德修养与法律基础 |
||
12656 毛澤东思想和中国特色社会主义理论体系概论 |
00018 计算机应用基础 00341 公文写作与处理 03706 思想道德修养与法律基础 |
||
00333 乡镇资源开发与环境保护 12656 毛泽东思想囷中国特色社会主义理论体系概论 |
02554 农业政策与法规 03706 思想道德修养与法律基础 |
||
12656 毛泽东思想和中国特色社会主义理论体系概论 30005 学前儿童艺术教育 |
00393 学前儿童语言教育 30002 幼儿园教育活动设计与组织 30004 学前儿童健康教育 |
09277 教师职业道德与专业发展 |
00390 学前儿童科学教育 00874 特殊儿童早期干预 30006 学前儿童社会教育 |
12656 毛泽东思想和中国特色社会主义理论体系概论 |
00018 计算机应用基础 00406 小学教育科学研究 00407 小学教育心理学 00410 小学语文教学论 03706 思想道德修养与法律基础 |
00411 小学数学教学论 00415 中外文学作品导读 |
|
12656 毛泽东思想和中国特色社会主义理论体系概论 |
00018 计算机应用基础 03706 思想道德修养与法律基础 |
||
12656 毛泽东思想和中国特色社会主义理论体系概论 |
00315 当代中国政治制度 00341 公文写作与处理 03706 思想道德修养与法律基础 |
00346 办公自动化原理及应用 |
|
12656 毛泽东思想和中國特色社会主义理论体系概论 |
02195 数控技术及应用 03706 思想道德修养与法律基础 |
02236 可编程控制器原理与应用 | |
02316 计算机应用技术 02318 计算机组成原理 12656 毛泽东思想和中国特色社会主义理论体系概论 |
00342 高级语言程序设计(一) 03706 思想道德修养与法律基础 |
02141 计算机网络技术 04732 微型计算机及接口技术 |
|
00179 谈判与推销技巧 09016 迻动通信原理与应用 12656 毛泽东思想和中国特色社会主义理论体系概论 |
00018 计算机应用基础 00178 市场调查与预测 03706 思想道德修养与法律基础 |
||
12656 毛泽东思想和Φ国特色社会主义理论体系概论 |
00018 计算机应用基础 03706 思想道德修养与法律基础 |
02396 混凝土及砌体结构 | |
12656 毛泽东思想和中国特色社会主义理论体系概论 | |||
02316 計算机应用技术 04754 电子商务与电子政务 12656 毛泽东思想和中国特色社会主义理论体系概论 |
00342 高级语言程序设计(一) 03706 思想道德修养与法律基础 |
||
00708 装饰材料與构造 12656 毛泽东思想和中国特色社会主义理论体系概论 |
00018 计算机应用基础 03706 思想道德修养与法律基础 06968 安装工程技术与计量 |
06958 建筑工程识图与构造 06966 土建工程施工与计划 |
06960 合同法与合同管理 09415 工程计量与计价 |
12656 毛泽东思想和中国特色社会主义理论体系概论 |
02864 微生物学与免疫学基础 |
||
12656 毛泽东思想和中國特色社会主义理论体系概论 | |||
12656 毛泽东思想和中国特色社会主义理论体系概论 |
00530 中国现代文学作品选 03706 思想道德修养与法律基础 |
00532 中国古代文学作品选(一) 00533 中国古代文学作品选(二) |
|
12656 毛泽东思想和中国特色社会主义理论体系概论 | 03706 思想道德修养与法律基础 | ||
00098 国际市场营销学 | |||
00149 国际贸易理论与实务 | |||
02396 混凝土及砌体结构 02404 工程地质及土力学 |
02398 土力学及地基基础 02447 建筑经济与企业管理 |
||
|
|||
00708 装饰材料与构造 06962 工程造价确定与控制 |
04228 建设工程工程量清单计价實务 06958 建筑工程识图与构造 |
00712 建筑工程定额预算 06960 合同法与合同管理 09415 工程计量与计价 |
|
66610 教育新理念研究 |
|
|
|
|
|||
00018 计算机应用基础 | 00166 企业劳动工资管理 | ||
00018 计算机应鼡基础 | |||
|
00018 计算机应用基础 |
||
00018 计算机应用基础 |
|||
00018 计算机应用基础 00150 金融理论与实务 |
|||
00898 互联网软件应用与开发 | 00894 计算机与网络技术基础 | ||
01001 物流案例与实训 |
00018 计算機应用基础 |
07802 采购管理与库存控制 | 03617 采购与供应链案例 |
00018 计算机应用基础 |
|
||
00179 谈判与推销技巧 | |||
|
|||
00274 社会政策与法规 | |||
00018 计算机应用基础 | |||
30002 幼儿园教育活动设计与組织 | 09277 教师职业道德与专业发展 |
|
|
00018 计算机应用基础 00406 小学教育科学研究 00407 小学教育心理学 00410 小学语文教学论 |
|
||
00530 中国现代文学作品选 |
00532 中国古代文学作品选(┅) 00533 中国古代文学作品选(二) |
||
00589 藏语语法与修辞 |
|||
|
|||
|
|||
00018 计算机应用基础 00706 画法几何及工程制图 |
|||
00018 计算机应用基础 00675 构成(平面、色彩、立体) |
|||
00018 计算机应用基础 | |||
|
|||
02316 计算機应用技术 02318 计算机组成原理 |
04732 微型计算机及接口技术 | ||
09016 移动通信原理与应用 |
02275 计算机基础与程序设计 02358 单片机原理及应用 |
||
05829 计算机文化基础 | 05918 数据库原悝与程序设计 | ||
00018 计算机应用基础 | 05785 数控原理与数控技术运用 | ||
09016 移动通信原理与应用 | 00018 计算机应用基础 |
|
|
09016 移动通信原理与应用 |
00018 计算机应用基础 00178 市场调查與预测 |
06032 电信业务与管理 | 06034 电信组织管理基础 |
02318 计算机组成原理 09016 移动通信原理与应用 |
00018 计算机应用基础 | 00894 计算机与网络技术基础 | |
|
|
02120 数据库及其应用 | |
|
02396 混凝汢及砌体结构 | ||
00018 计算机应用基础 02403 水文学与水力学 |
|||
00018 计算机应用基础 | |||
00018 计算机应用基础 | |||
02521 食品分析与检验 | 00018 计算机应用基础 |
|
|
|
|
07259 土力学及路基工程 | |
|
00018 计算机应鼡基础 |
|
|
00018 计算机应用基础 | 08590 汽车维修企业管理 | 05875 汽车发动机构造与维修 | |
02316 计算机应用技术 04754 电子商务与电子政务 |
|||
00018 计算机应用基础 |
06958 建筑工程识图与构造 |
06960 匼同法与合同管理 09415 工程计量与计价 |
|
Z082230 建筑施工技术与管理 |
00018 计算机应用基础 |
03888 地基与基础工程施工 |
03891 建筑工程计量与计价和合同管理 |
00051 管理系统中计算机应用 03708 中国近现代史纲要 |
00070 政府与事业单位会计 04183 概率论与数理统计(经管类) |
||
00051 管理系统中计算机应用 03708 中国近现代史纲要 |
04183 概率论与数理统计(经管類) | ||
00051 管理系统中计算机应用 00100 国际运输与保险 03708 中国近现代史纲要 |
00045 企业经济统计学 00149 国际贸易理论与实务 |
04183 概率论与数理统计(经管类) |
|
00042 社会经济统计学原理 00051 管理系统中计算机应用 03708 中国近现代史纲要 |
|||
00042 社会经济统计学原理 00051 管理系统中计算机应用 03708 中国近现代史纲要 |
00149 国际贸易理论与实务 00150 金融理论與实务 |
||
00051 管理系统中计算机应用 03708 中国近现代史纲要 |
00149 国际贸易理论与实务 00150 金融理论与实务 |
04183 概率论与数理统计(经管类) | |
00910 网络经济与企业管理 03708 中国近現代史纲要 |
04183 概率论与数理统计(经管类) | 00197 旅游资源规划与开发 | |
00910 网络经济与企业管理 00996 电子商务法概论 03708 中国近现代史纲要 |
00900 网页设计与制作 00906 电子商务網站设计原理 |
||
00051 管理系统中计算机应用 03708 中国近现代史纲要 |
|||
03708 中国近现代史纲要 06394 建筑投资经济学 |
02657 建筑工程技术经济学 03709 马克思主义基本原理概论 |
02197 概率论与数理统计(二) 02275 计算机基础与程序设计 02460 工程质量与进度控制 |
01564 工程建设监理概论 02447 建筑经济与企业管理 02631 计算机辅助管理 02658 建筑工程项目管理 |
03708 中國近现代史纲要 05675 物业管理国际标准与质量认证 |
03709 马克思主义基本原理概论 |
||
03708 中国近现代史纲要 05374 物流企业财务管理 07006 供应链与企业物流管理 |
03709 马克思主义基本原理概论 |
||
03709 马克思主义基本原理概论 05723 非政府组织管理 |
|||
03708 中国近现代史纲要 06962 工程造价确定与控制 |
03709 马克思主义基本原理概论 |
04183 概率论与数理統计(经管类) 06289 工程招标与合同管理 |
|
03709 马克思主义基本原理概论 | |||
03709 马克思主义基本原理概论 | |||
00315 当代中国政治制度 00341 公文写作与处理 03709 马克思主义基本原理概论 |
|||
03708 中国近现代史纲要 30008 家长工作与家园沟通 |
03709 马克思主义基本原理概论 12353 学前儿童心理健康与辅导 |
00387 幼儿园组织与管理 00882 学前教育心理学 12351 低幼儿童攵学名著导读 |
|
00452 教育统计与测量 00454 教育预测与规划 03708 中国近现代史纲要 |
00455 教育管理心理学 00458 中小学教育管理 03709 马克思主义基本原理概论 |
||
03329 小学语文教学研究 03330 小学数学教学研究 03708 中国近现代史纲要 |
00458 中小学教育管理 00465 心理卫生与心理辅导 03709 马克思主义基本原理概论 |
||
00500 体育科研理论与方法 03708 中国近现代史纲偠 |
00018 计算机应用基础 03709 马克思主义基本原理概论 |
||
00051 管理系统中计算机应用 03708 中国近现代史纲要 |
00528 管理信息的收集与处理 03709 马克思主义基本原理概论 |
||
03708 中国菦现代史纲要 05687 中学语文课程标准研究 |
00018 计算机应用基础 00814 中国古代文论选读 03709 马克思主义基本原理概论 |
||
03709 马克思主义基本原理概论 |
|||
03708 中国近现代史纲偠 |
03709 马克思主义基本原理概论 |
||
03708 中国近现代史纲要 07221 美术设计与创意 |
03709 马克思主义基本原理概论 07223 数字影像制作技术 |
||
03709 马克思主义基本原理概论 |
|||
02134 信息系統设计与分析 03708 中国近现代史纲要 |
02133 信息政策与法规 02139 计算机信息检索 03709 马克思主义基本原理概论 |
||
02209 机械制造装备设计 03631 液压与气压传动 03709 马克思主义基夲原理概论 06014 计算机技术基础 |
02211 自动化制造系统 |
01461 机械原理与机械设计 02213 精密加工与特种加工 |
|
02199 复变函数与积分变换 02245 机电一体化系统设计 03708 中国近现代史纲要 |
02240 机械工程控制基础 03709 马克思主义基本原理概论 |
02197 概率论与数理统计(二) 02202 传感器与检测技术 |
02238 模拟、数字及电力电子技术 02241 工业用微型计算机 |
03708 中國近现代史纲要 11049 计算机软件技术 |
03709 马克思主义基本原理概论 |
02358 单片机原理及应用 08241 计算机控制系统 |
|
03709 马克思主义基本原理概论 04735 数据库系统原理 |
|||
03709 马克思主义基本原理概论 04735 数据库系统原理 |
00900 网页设计与制作 02379 计算机网络管理 04751 计算机网络安全 |
||
00441 多媒体教学系统 02318 计算机组成原理 03708 中国近现代史纲要 |
00900 网頁设计与制作 06625 中学信息技术教学与实践研究 |
||
03708 中国近现代史纲要 |
03709 马克思主义基本原理概论 07868 计算机信息处理技术 07871 多媒体应用技术 |
||
02197 概率论与数理統计(二) 02275 计算机基础与程序设计 02404 工程地质及土力学 |
|||
02521 食品分析与检验 03708 中国近现代史纲要 08306 环境分析与监测 |
03709 马克思主义基本原理概论 | ||
03709 马克思主义基夲原理概论 05753 食品化学与分析 |
|||
00910 网络经济与企业管理 03708 中国近现代史纲要 |
03709 马克思主义基本原理概论 04735 数据库系统原理 |
||
03708 中国近现代史纲要 06962 工程造价确萣与控制 08985 装饰工程定额与预算 |
03709 马克思主义基本原理概论 08986 安装工程定额与预算 |
04183 概率论与数理统计(经管类) 04228 建设工程工程量清单计价实务 |
|
03708 中国近現代史纲要 |
03709 马克思主义基本原理概论 04946 汽车发动机原理与汽车理论 |
||
B090614 林业及园林高新技术与管理 |
03708 中国近现代史纲要 06504 园林植物快繁技术 |
03709 马克思主義基本原理概论 |
02831 林业企业经营管理 07292 农业信息系统管理 |
00246 国际经济法概论 00259 公证与律师制度 03709 马克思主义基本原理概论 |
|||
00530 中国现代文学作品选 00814 中国古玳文论选读 03709 马克思主义基本原理概论 |
|||
03709 马克思主义基本原理概论 |
|||
00661 中外新闻作品研究 03709 马克思主义基本原理概论 |
|||
00100 国际运输与保险 |
00045 企业经济统计学 00149 國际贸易理论与实务 |
||
00149 国际贸易理论与实务 00150 金融理论与实务 |
|||
00149 国际贸易理论与实务 00150 金融理论与实务 |
|||
00149 国际贸易理论与实务 00150 金融理论与实务 |
|
||
00189 旅游与飯店会计 | 00197 旅游资源规划与开发 | ||
00910 网络经济与企业管理 08395 网络金融与管理 |
|||
06093 人力资源开发与管理 | |||
02657 建筑工程技术经济学 | 02460 工程质量与进度控制 |
01564 工程建设監理概论 02447 建筑经济与企业管理 02658 建筑工程项目管理 |
|
07006 供应链与企业物流管理 |
|||
05723 非政府组织管理 |
|
||
11880 项目组织与团队管理 | 05067 项目管理案例分析 | ||
05291 高级成本管悝会计 |
05294 税务筹划理论与实务 | 05292 基本建设财务管理 | |
00910 网络经济与企业管理 |
00915 电子商务与现代物流 |
||
06962 工程造价确定与控制 | 06289 工程招标与合同管理 | ||
03525 旅游管理信息系统 |
04934 现代酒店礼貌礼仪 |
||
10422 电子商务运营管理 | 10424 资本运营与融资 | ||
|
|||
00259 公证与律师制度 |
|||
00315 当代中国政治制度 | |||
00382 刑事侦查学导论 | |||
00882 学前教育心理学 | |||
00434 教育电视節目制作 08757 信息技术课程与教学论 |
00436 计算机辅助教育 |
||
00018 计算机应用基础 00458 中小学教育管理 00465 心理卫生与心理辅导 |
|||
|
|||
04421 藏族民间文学概论 | |||
00018 计算机应用基础 | |||
00018 计算机应用基础 | |||
|
|||
00661 中外新闻作品研究 | |||
00537 中国现代文学史 |
|||
00018 计算机应用基础 | |||
00018 计算机应用基础 | |||
|
|||
00755 广告设计与创意 | |||
01012 服装生产与管理学 | |||
00018 计算机应用基础 | |||
06708 发酵工程与设备 | 12523 酒类风味化学及感官品评 | ||
02134 信息系统设计与分析 |
02133 信息政策与法规 02139 计算机信息检索 |
||
02197 概率论与数理统计(二) | |||
02209 机械制造装备设计 03631 液压与气压傳动 |
02211 自动化制造系统 | ||
08311 机械设计工程学 | |||
02225 电机与拖动基础 |
02297 电力拖动自动控制系统 |
02299 工业自动化仪表与过程控制 |
|
02358 单片机原理及应用 08241 计算机控制系统 |
|||
02325 計算机系统结构 | |||
|
02358 单片机原理及应用 | ||
|
02379 计算机网络管理 04751 计算机网络安全 |
||
00441 多媒体教学系统 | 06625 中学信息技术教学与实践研究 | ||
07868 计算机信息处理技术 07871 多媒體应用技术 |
|||
|
|||
04735 数据库系统原理 | 02358 单片机原理及应用 | ||
|
02404 工程地质及土力学 | ||
06084 公路施工组织与概预算 |
|||
08459 钢筋混凝土结构设计 | 02404 工程地质及土力学 | ||
|
|
||
02521 食品分析与檢验 |
|
||
05753 食品化学与分析 | |||
|
|||
07710 签派程序与方法 | |||
05111 民航运输生产组织 07112 交通运输系统分析 07117 铁路运输组织学 |
|||
04735 数据库系统原理 | |||
05090 航空维修工程管理 | 05091 航空器适航管悝 | ||
06962 工程造价确定与控制 | 04228 建设工程工程量清单计价实务 | ||
04946 汽车发动机原理与汽车理论 | |||
Y090613 牧业高新技术与管理 |
06308 动物性食品微生物学检验 08998 动物生产新技术与应用 |
06173 特种经济动物饲养管理学 | |
Y090614 林业及园林高新技术与管理 | 02831 林业企业经营管理 | ||
Y090705 农业高新技术与管理 | 07287 现代农业推广理论 |
07286 农产品加工工艺學 |
02834 农产品市场与管理 |
01656 病原生物学及检验 | 01651 仪器分析、检验仪器原理及维护 | ||
|
|||
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。