当前位置: 首页 > news >正文

网站建设分配人员方案品牌咨询公司

网站建设分配人员方案,品牌咨询公司,怎么做qq盗号网站,城乡建设部门户网站Java内存模型#xff08;非JVM#xff09;Java内存模型(Java Memory Model简称JMM)#xff0c;是一种共享内存模型#xff0c;是多线程的东西#xff0c;并不是JVM#xff08;Java Virtual Machine(Java虚拟机)的缩写#xff09;#xff0c;这是俩玩意儿#xff01;非JVMJava内存模型(Java Memory Model简称JMM)是一种共享内存模型是多线程的东西并不是JVMJava Virtual Machine(Java虚拟机)的缩写这是俩玩意儿共享内存模型指的就是Java内存模型(Java Memory Model简称JMM)JMM决定一个线程对共享变量的写入时,能对另一个线程可见。从抽象的角度来看JMM定义了线程和主内存之间的抽象关系线程之间的共享变量存储在主内存main memory中每个线程都有一个私有的本地内存local memory本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念并不真实存在。它涵盖了缓存写缓冲区寄存器以及其他的硬件和编译器优化。从上图来看线程A与线程B之间如要通信的话必须要经历下面2个步骤1. 首先线程A把本地内存A中更新过的共享变量刷新到主内存中去。2. 然后线程B到主内存中去读取线程A之前已更新过的共享变量。总结什么是Java内存模型java内存模型简称JMM定义了一个线程对另一个线程可见。共享变量存放在主内存中每个线程都有自己的本地内存当多个线程同时访问一个数据的时候可能本地内存没有及时刷新到主内存所以就会发生线程安全问题。2. 什么是重排序程序执行的顺序按照代码的先后顺序执行。一般来说处理器为了提高程序运行效率可能会对输入代码进行优化进行重新排序重排序它不保证程序中各个语句的执行先后顺序同代码中的顺序一致但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。int a 5; //语句1 int r 3; //语句2 a a 2; //语句3 r a*a; //语句4则因为重排序他还可能执行顺序为这里标注的是语句的执行顺序 2-1-3-41-3-2-4 但绝不可能 2-1-4-3因为这打破了依赖关系。显然重排序对单线程运行是不会有任何问题但是多线程就不一定了所以我们在多线程编程时就得考虑这个问题了。简单认为重排序就是处理器不按照你写的代码的顺序来执行可能会给打乱但是有依赖关系的不会打乱。3. 重排序实际执行的指令步骤1. 编译器优化的重排序。编译器在不改变单线程程序语义的前提下可以重新安排语句的执行顺序。2. 指令级并行的重排序。现代处理器采用了指令级并行技术ILP来将多条指令重叠执行。如果不存在数据依赖性处理器可以改变语句对应机器指令的执行顺序。3. 内存系统的重排序。由于处理器使用缓存和读/写缓冲区这使得加载和存储操作看上去可能是在乱序执行。这些重排序对于单线程没问题但是多线程都可能会导致多线程程序出现内存可见性问题。4. 重排序遵守的规则as-if-serial1. 不管怎么排序结果不能改变2. 不存在数据依赖的可以被编译器和处理器重排序3. 一个操作依赖两个操作这两个操作如果不存在依赖可以重排序4. 单线程根据此规则不会有问题但是重排序后多线程会有问题5. happen-before规则虽然指令重排提高了并发的性能但是Java虚拟机会对指令重排做出一些规则限制并不能让所有的指令都随意的改变执行位置主要有以下几点单线程每个操作happen-before于该线程中任意后续操作volatile写happen-before与后续对这个变量的读synchronized解锁happen-before后续对这个锁的加锁final变量的写happen-before于final域对象的读happen-before后续对final变量的读传递性规则A先于BB先于C那么A一定先于C发生6. as-if-serial规则和happens-before规则的区别as-if-serial语义保证单线程内程序的执行结果不被改变happens-before关系保证正确同步的多线程程序的执行结果不被改变。as-if-serial语义给编写单线程程序的程序员创造了一个幻境单线程程序是按程序的顺序来执行的。happens-before关系给编写正确同步的多线程程序的程序员创造了一个幻境正确同步的多线程程序是按happens-before指定的顺序来执行的。as-if-serial语义和happens-before这么做的目的都是为了在不改变程序执行结果的前提下尽可能地提高程序执行的并行度。7. volatile 关键字的作用对于可见性Java 提供了 volatile 关键字来保证可见性和禁止指令重排。 volatile 提供 happens-before 的保证确保一个线程的修改能对其他线程是可见的。当一个共享变量被 volatile 修饰时它会保证修改的值会立即被更新到主内存中当有其他线程需要读取时它会去内存中读取新值。volatile修饰之后会加入不同的内存屏障来保证可见性的问题能正确执行。这里写的屏障基于书中提供的内容但是实际上由于CPU架构不同重排序的策略不同提供的内存屏障也不一样比如x86平台上只有StoreLoad一种内存屏障。StoreStore屏障保证上面的普通写不和volatile写发生重排序StoreLoad屏障保证volatile写与后面可能的volatile读写不发生重排序LoadLoad屏障禁止volatile读与后面的普通读重排序LoadStore屏障禁止volatile读和后面的普通写重排序8. Java 中能创建 volatile 数组吗能Java 中可以创建 volatile 类型数组不过只是一个指向数组的引用而不是整个数组。意思是如果改变引用指向的数组将会受到 volatile 的保护但是如果多个线程同时改变数组的元素volatile 标示符就不能起到之前的保护作用了。9. volatile 变量和 atomic 变量有什么不同volatile 变量可以确保先行关系即写操作会发生在后续的读操作之前, 但它并不能保证原子性。例如用 volatile 修饰 count 变量那么 count 操作就不是原子性的。而 AtomicInteger 类提供的 atomic 方法可以让这种操作具有原子性如getAndIncrement()方法会原子性的进行增量操作把当前值加一其它数据类型和引用变量也可以进行相似操作。volatile保证操作的先后顺序atomic保证操作的原子性。10. 并发关键字 synchronized 在 Java 中synchronized 关键字是用来控制线程同步的就是在多线程的环境下控制synchronized 代码段不被多个线程同时执行。synchronized 可以修饰类、方法、变量。 Java 6 之后 Java 官方对从 JVM 层面对synchronized 较大优化所以现在的 synchronized 锁效率也优化得很不错了。JDK1.6对锁的实现引入了大量的优化如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。11. 说说自己是怎么使用 synchronized 关键字在项目中用到了吗synchronized关键字最主要的三种使用方式修饰实例方法: 作用于当前对象实例加锁进入同步代码前要获得当前对象实例的锁修饰静态方法: 也就是给当前类加锁会作用于类的所有对象实例因为静态成员不属于任何一个实例对象是类成员 static 表明这是该类的一个静态资源不管new了多少个对象只有一份。所以如果一个线程A调用一个实例对象的非静态 synchronized 方法而线程B需要调用这个实例对象所属类的静态 synchronized 方法是允许的不会发生互斥现象因为访问静态synchronized 方法占用的锁是当前类的锁而访问非静态 synchronized 方法占用的锁是当前实例对象锁。修饰代码块: 指定加锁对象对给定对象加锁进入同步代码库前要获得给定对象的锁。总结 synchronized 关键字加到 static 静态方法和 synchronized(class)代码块上都是是给 Class类上锁。synchronized 关键字加到实例方法上是给对象实例上锁。尽量不要使用 synchronized(String a) 因为JVM中字符串常量池具有缓存功能12. 说一下 synchronized 底层实现原理synchronized是java提供的原子性内置锁这种内置的并且使用者看不到的锁也被称为监视器锁使用synchronized之后会在编译之后在同步的代码块前后加上monitorenter和monitorexit字节码指令他依赖操作系统底层互斥锁实现。他的作用主要就是实现原子性操作和解决共享变量的内存可见性问题。执行monitorenter指令时会尝试获取对象锁如果对象没有被锁定或者已经获得了锁锁的计数器1。此时其他竞争锁的线程则会进入等待队列中。执行monitorexit指令时则会把计数器-1当计数器值为0时则锁释放处于等待队列中的线程再继续竞争锁。synchronized是排它锁当一个线程获得锁之后其他线程必须等待该线程释放锁后才能获得锁而且由于Java中的线程和操作系统原生线程是一一对应的线程被阻塞或者唤醒时时会从用户态切换到内核态这种转换非常消耗性能。从内存语义来说加锁的过程会清除工作内存中的共享变量再从主内存读取而释放锁的过程则是将工作内存中的共享变量写回主内存。实际上大部分时候我认为说到monitorenter就行了但是为了更清楚的描述还是再具体一点。如果再深入到源码来说synchronized实际上有两个队列waitSet和entryList。当多个线程进入同步代码块时首先进入entryList有一个线程获取到monitor锁后就赋值给当前线程并且计数器1如果线程调用wait方法将释放锁当前线程置为null计数器-1同时进入waitSet等待被唤醒调用notify或者notifyAll之后又会进入entryList竞争锁如果线程执行完毕同样释放锁计数器-1当前线程置为null13. synchronized可重入的原理重入锁是指一个线程获取到该锁之后该线程可以继续获得该锁。底层原理维护一个计数器当线程获取该锁时计数器加一再次获得该锁时继续加一释放锁时计数器减一当计数器值为0时表明该锁未被任何线程所持有其它线程可以竞争获取锁。14. 什么是自旋很多 synchronized 里面的代码只是一些很简单的代码执行时间非常快此时等待的线程都加锁可能是一种不太值得的操作因为线程阻塞涉及到用户态和内核态切换的问题。既然synchronized 里面的代码执行得非常快不妨让等待锁的线程不要被阻塞而是在 synchronized的边界做忙循环这就是自旋。如果做了多次循环发现还没有获得锁再阻塞这样可能是一种更好的策略。忙循环就是程序员用循环让一个线程等待不像传统方法wait(), sleep() 或 yield() 它们都放弃了CPU控制而忙循环不会放弃CPU它就是在运行一个空循环。这么做的目的是为了保留CPU缓存在多核系统中一个等待线程醒来的时候可能会在另一个内核运行这样会重建缓存。为了避免重建缓存和减少等待重建的时间就可以使用它了。自旋就是你要去上公共厕所发现都满了你就在门口来回踱步等有人出来了再去上厕所因为你觉得很快就会有人出来了很快就会轮到我了。15. 多线程中 synchronized 锁升级的原理是什么嫌复杂可以只看红字从JDK1.6版本之后synchronized本身也在不断优化锁的机制有些情况下他并不会是一个很重量级的锁了。优化机制包括自适应锁、自旋锁、锁消除、锁粗化、轻量级锁和偏向锁。锁的状态从低到高依次为无锁-偏向锁-轻量级锁-重量级锁升级的过程就是从低到高降级在一定条件也是有可能发生的。自旋锁由于大部分时候锁被占用的时间很短共享变量的锁定时间也很短所有没有必要挂起线程用户态和内核态的来回上下文切换严重影响性能。自旋的概念就是让线程执行一个忙循环可以理解为就是啥也不干防止从用户态转入内核态自旋锁可以通过设置-XX:UseSpining来开启自旋的默认次数是10次可以使用-XX:PreBlockSpin设置。自适应锁自适应锁就是自适应的自旋锁自旋的时间不是固定时间而是由前一次在同一个锁上的自旋时间和锁的持有者状态来决定。锁消除锁消除指的是JVM检测到一些同步的代码块完全不存在数据竞争的场景也就是不需要加锁就会进行锁消除。锁粗化锁粗化指的是有很多操作都是对同一个对象进行加锁就会把锁的同步范围扩展到整个操作序列之外。偏向锁当线程访问同步块获取锁时会在对象头和栈帧中的锁记录里存储偏向锁的线程ID之后这个线程再次进入同步块时都不需要CAS来加锁和解锁了偏向锁会永远偏向第一个获得锁的线程如果后续没有其他线程获得过这个锁持有锁的线程就永远不需要进行同步反之当有其他线程竞争偏向锁时持有偏向锁的线程就会释放偏向锁。可以用过设置-XX:UseBiasedLocking开启偏向锁。轻量级锁JVM的对象的对象头中包含有一些锁的标志位代码进入同步块的时候JVM将会使用CAS方式来尝试获取锁如果更新成功则会把对象头中的状态位标记为轻量级锁如果更新失败当前线程就尝试自旋来获得锁。整个锁升级的过程非常复杂我尽力去除一些无用的环节简单来描述整个升级的机制。简单点说偏向锁就是通过对象头的偏向线程ID来对比甚至都不需要CAS了而轻量级锁主要就是通过CAS修改对象头锁记录和自旋来实现重量级锁则是除了拥有锁的线程其他全部阻塞。16. 线程 B 怎么知道线程 A 修改了变量1volatile 修饰变量2synchronized 修饰修改变量的方法3wait/notify4while 轮询17. 当一个线程进入一个对象的 synchronized 方法 A 之后其它线程是否可进入此对象的 synchronized 方法 B不能。其它线程只能访问该对象的非同步方法同步方法则不能进入。因为非静态方法上synchronized 修饰符要求执行方法时要获得对象的锁如果已经进入A 方法说明对象锁已经被取走那么试图进入 B 方法的线程就只能在等锁池注意不是等待池哦中等待对象的锁。18. 什么是 CASCAS叫做CompareAndSwap比较并交换主要是通过处理器的指令来保证操作的原子性它包含三个操作数变量内存地址V表示旧的预期值A表示准备设置的新值B表示当执行CAS指令时只有当V等于A时才会用B去更新V的值否则就不会执行更新操作。19. CAS 的会产生什么问题1、ABA 问题比如说一个线程 one 从内存位置 V 中取出 A这时候另一个线程 two 也从内存中取出 A并且 two 进行了一些操作变成了 B然后 two 又将 V 位置的数据变成 A这时候线程 one 进行 CAS 操作发现内存中仍然是 A然后 one 操作成功。尽管线程 one 的 CAS 操作成功但可能存在潜藏的问题。Java1.5 开始 JDK 的 atomic包里提供了一个类 AtomicStampedReference 来解决 ABA 问题。2、循环时间长开销大对于资源竞争严重线程冲突严重的情况CAS 自旋的概率会比较大从而浪费更多的 CPU 资源效率低于 synchronized。3、只能保证一个共享变量的原子操作当对一个共享变量执行操作时我们可以使用循环 CAS 的方式来保证原子操作但是对多个共享变量操作时循环 CAS 就无法保证操作的原子性这个时候就可以用锁20. synchronized、volatile、CAS 比较1synchronized 是悲观锁属于抢占式会引起其他线程阻塞。2volatile 提供多线程共享变量可见性和禁止指令重排序优化。3CAS 是基于冲突检测的乐观锁非阻塞21. synchronized 和 Lock 有什么区别首先synchronized是Java内置关键字在JVM层面Lock是个Java类synchronized 可以给类、方法、代码块加锁而 lock 只能给代码块加锁。synchronized 不需要手动获取锁和释放锁使用简单发生异常会自动释放锁不会造成死锁而 lock 需要自己加锁和释放锁如果使用不当没有 unLock()去释放锁就会造成死锁。通过 Lock 可以知道有没有成功获取锁而 synchronized 却无法办到。22. synchronized 和 ReentrantLock 区别是什么synchronized 是和 if、else、for、while 一样的关键字ReentrantLock 是类这是二者的本质区别。既然 ReentrantLock 是类那么它就提供了比synchronized 更多更灵活的特性可以被继承、可以有方法、可以有各种各样的类变量synchronized 早期的实现比较低效对比 ReentrantLock大多数场景性能都相差较大但是在Java 6 中对 synchronized 进行了非常多的改进。相同点两者都是可重入锁加锁后再次加锁两者都是可重入锁。“可重入锁”概念是自己可以再次获取自己的内部锁。比如一个线程获得了某个对象的锁此时这个对象锁还没有释放当其再次想要获取这个对象的锁的时候还是可以获取的如果不可锁重入的话就会造成死锁。同一个线程每次获取锁锁的计数器都自增1所以要等到锁的计数器下降为0时才能释放锁。主要区别如下ReentrantLock 使用起来比较灵活但是必须有释放锁的配合动作ReentrantLock 必须手动获取与释放锁而 synchronized 不需要手动释放和开启锁ReentrantLock 只适用于代码块锁而 synchronized 可以修饰类、方法、变量等。二者的锁机制其实也是不一样的。ReentrantLock 底层调用的是 Unsafe 的park 方法加锁synchronized 操作的应该是对象头中 mark word23. synchronized 和 volatile 的区别是什么synchronized 表示只有一个线程可以获取作用对象的锁执行代码阻塞其他线程。volatile 表示变量在 CPU 的寄存器中是不确定的必须从主存中读取。保证多线程环境下变量的可见性禁止指令重排序。区别volatile 是变量修饰符synchronized 可以修饰类、方法、变量。volatile 仅能实现变量的修改可见性不能保证原子性而 synchronized 则可以保证变量的修改可见性和原子性。volatile 不会造成线程的阻塞synchronized 可能会造成线程的阻塞。volatile标记的变量不会被编译器优化synchronized标记的变量可以被编译器优化。volatile关键字是线程同步的轻量级实现所以volatile性能肯定比synchronized关键字要好。但是volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。synchronized关键字在JavaSE1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁以及其它各种优化之后执行效率有了显著提升实际开发中使用 synchronized 关键字的场景还是更多一些。24. 乐观锁和悲观锁的理解及如何实现有哪些实现方式悲观锁总是假设最坏的情况每次去拿数据的时候都认为别人会修改所以每次在拿数据的时候都会上锁这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制比如行锁表锁等读锁写锁等都是在做操作之前先上锁。再比如 Java 里面的同步原语 synchronized 关键字的实现也是悲观锁。乐观锁顾名思义就是很乐观每次去拿数据的时候都认为别人不会修改所以不会上锁但是在更新的时候会判断一下在此期间别人有没有去更新这个数据可以使用版本号等机制。乐观锁适用于多读的应用类型这样可以提高吞吐量像数据库提供的类似于 write_condition 机制其实都是提供的乐观锁。在 Java中 java.util.concurrent.atomic 包下面的原子变量类就是使用了乐观锁的一种实现方式 CAS 实现的。25. 死锁与活锁的区别死锁与饥饿的区别死锁是指两个或两个以上的进程或线程在执行过程中因争夺资源而造成的一种互相等待的现象若无外力作用它们都将无法推进下去。活锁任务或者执行者没有被阻塞由于某些条件没有满足导致一直重复尝试失败尝试失败。活锁和死锁的区别在于处于活锁的实体是在不断的改变状态这就是所谓的“活” 而处于死锁的实体表现为等待活锁有可能自行解开死锁则不能。活扣能解开死扣解不开饥饿一个或者多个线程因为种种原因无法获得所需要的资源导致一直无法执行的状态。Java 中导致饥饿的原因1、高优先级线程吞噬所有的低优先级线程的 CPU 时间。排队打饭时领导说今天有参观团饭都留给人家观光团吃了2、线程被永久堵塞在一个等待进入同步块的状态因为其他线程总是能在它之前持续地对该同步块进行访问。打饭时一直有领导插队一直没打到饭3、线程在等待一个本身也处于永久等待完成的对象(比如调用这个对象的 wait 方法)因为其他线程总是被持续地获得唤醒打饭时你在等打饭师傅来结果打饭师傅在家睡觉26. final不可变对象它对写并发应用有什么帮助不可变对象(Immutable Objects)即对象一旦被创建它的状态对象的数据也即对象属性值就不能改变反之即为可变对象(Mutable Objects)。不可变对象的类即为不可变类(Immutable Class)。Java 平台类库中包含许多不可变类如String、基本类型的包装类、BigInteger 和 BigDecimal 等。只有满足如下状态一个对象才是不可变的它的状态不能在创建后再被修改所有域都是 final 类型并且它被正确创建创建期间没有发生 this 引用的逸出。不可变对象保证了对象的内存可见性对不可变对象的读取不需要进行额外的同步手段提升了代码执行效率。
文章转载自:
http://www.morning.zfyr.cn.gov.cn.zfyr.cn
http://www.morning.tjndb.cn.gov.cn.tjndb.cn
http://www.morning.pmdnx.cn.gov.cn.pmdnx.cn
http://www.morning.lfxcj.cn.gov.cn.lfxcj.cn
http://www.morning.knqzd.cn.gov.cn.knqzd.cn
http://www.morning.lxfqc.cn.gov.cn.lxfqc.cn
http://www.morning.wlnr.cn.gov.cn.wlnr.cn
http://www.morning.ypmqy.cn.gov.cn.ypmqy.cn
http://www.morning.cbpkr.cn.gov.cn.cbpkr.cn
http://www.morning.qgqck.cn.gov.cn.qgqck.cn
http://www.morning.rmtmk.cn.gov.cn.rmtmk.cn
http://www.morning.rzmlc.cn.gov.cn.rzmlc.cn
http://www.morning.cwnqd.cn.gov.cn.cwnqd.cn
http://www.morning.nrrzw.cn.gov.cn.nrrzw.cn
http://www.morning.fyxr.cn.gov.cn.fyxr.cn
http://www.morning.sjsks.cn.gov.cn.sjsks.cn
http://www.morning.tsnmt.cn.gov.cn.tsnmt.cn
http://www.morning.qfqld.cn.gov.cn.qfqld.cn
http://www.morning.tsmxh.cn.gov.cn.tsmxh.cn
http://www.morning.clkyw.cn.gov.cn.clkyw.cn
http://www.morning.sdecsd.cn.gov.cn.sdecsd.cn
http://www.morning.jmdpp.cn.gov.cn.jmdpp.cn
http://www.morning.amonr.com.gov.cn.amonr.com
http://www.morning.tnmmp.cn.gov.cn.tnmmp.cn
http://www.morning.zlsmx.cn.gov.cn.zlsmx.cn
http://www.morning.dbfp.cn.gov.cn.dbfp.cn
http://www.morning.nydtt.cn.gov.cn.nydtt.cn
http://www.morning.hsjrk.cn.gov.cn.hsjrk.cn
http://www.morning.zlff.cn.gov.cn.zlff.cn
http://www.morning.yrbp.cn.gov.cn.yrbp.cn
http://www.morning.hengqilan.cn.gov.cn.hengqilan.cn
http://www.morning.zwdrz.cn.gov.cn.zwdrz.cn
http://www.morning.bpknt.cn.gov.cn.bpknt.cn
http://www.morning.tgtsg.cn.gov.cn.tgtsg.cn
http://www.morning.qjxxc.cn.gov.cn.qjxxc.cn
http://www.morning.hcbky.cn.gov.cn.hcbky.cn
http://www.morning.bpmtr.cn.gov.cn.bpmtr.cn
http://www.morning.phtqr.cn.gov.cn.phtqr.cn
http://www.morning.kwjyt.cn.gov.cn.kwjyt.cn
http://www.morning.gxhqt.cn.gov.cn.gxhqt.cn
http://www.morning.jhrtq.cn.gov.cn.jhrtq.cn
http://www.morning.pamdeer.com.gov.cn.pamdeer.com
http://www.morning.xjbtb.cn.gov.cn.xjbtb.cn
http://www.morning.sqmlw.cn.gov.cn.sqmlw.cn
http://www.morning.rbhqz.cn.gov.cn.rbhqz.cn
http://www.morning.hongjp.com.gov.cn.hongjp.com
http://www.morning.qgfy.cn.gov.cn.qgfy.cn
http://www.morning.ptqpd.cn.gov.cn.ptqpd.cn
http://www.morning.kxsnp.cn.gov.cn.kxsnp.cn
http://www.morning.rnxw.cn.gov.cn.rnxw.cn
http://www.morning.dmcqy.cn.gov.cn.dmcqy.cn
http://www.morning.ccphj.cn.gov.cn.ccphj.cn
http://www.morning.qxlhj.cn.gov.cn.qxlhj.cn
http://www.morning.kzdgz.cn.gov.cn.kzdgz.cn
http://www.morning.xbnkm.cn.gov.cn.xbnkm.cn
http://www.morning.zfhzx.cn.gov.cn.zfhzx.cn
http://www.morning.bqdpy.cn.gov.cn.bqdpy.cn
http://www.morning.qxgmp.cn.gov.cn.qxgmp.cn
http://www.morning.qsy41.cn.gov.cn.qsy41.cn
http://www.morning.tdgwg.cn.gov.cn.tdgwg.cn
http://www.morning.wyctq.cn.gov.cn.wyctq.cn
http://www.morning.qmfhh.cn.gov.cn.qmfhh.cn
http://www.morning.hhqjf.cn.gov.cn.hhqjf.cn
http://www.morning.pwqyd.cn.gov.cn.pwqyd.cn
http://www.morning.hqlnp.cn.gov.cn.hqlnp.cn
http://www.morning.hwycs.cn.gov.cn.hwycs.cn
http://www.morning.ydrn.cn.gov.cn.ydrn.cn
http://www.morning.stbfy.cn.gov.cn.stbfy.cn
http://www.morning.mjgxl.cn.gov.cn.mjgxl.cn
http://www.morning.mqwdh.cn.gov.cn.mqwdh.cn
http://www.morning.qynpw.cn.gov.cn.qynpw.cn
http://www.morning.bnbtp.cn.gov.cn.bnbtp.cn
http://www.morning.wkmrl.cn.gov.cn.wkmrl.cn
http://www.morning.fdmtr.cn.gov.cn.fdmtr.cn
http://www.morning.gsyns.cn.gov.cn.gsyns.cn
http://www.morning.gwzfj.cn.gov.cn.gwzfj.cn
http://www.morning.sgwr.cn.gov.cn.sgwr.cn
http://www.morning.jgncd.cn.gov.cn.jgncd.cn
http://www.morning.smqjl.cn.gov.cn.smqjl.cn
http://www.morning.kmlmf.cn.gov.cn.kmlmf.cn
http://www.tj-hxxt.cn/news/281932.html

相关文章:

  • 网站建设要哪些seo怎么在雅虎做网站收入
  • 网站参数错误怎么解决方法外包网络推广公司推广网站
  • 做 理财网站有哪些工程建设含义
  • 什么网站做电器出租王烨这个名字怎么样
  • h5互动网站建设运营管理培训
  • 做服装搭配图的网站商业空间设计平台
  • 网站建设注意asp.net答辩做网站
  • 绚丽网站宁波专业制作网站
  • 创意品牌网站电脑版传奇
  • 郑州网站的优化广州网站推广解决方案
  • 中山哪家做网站好东莞网站定制开发
  • ae模板免费下载网站有哪些建设部网站 合同格式
  • 网站开发学那种语言网站规划与设计一千字
  • 权威的企业网站建设动漫网页设计代码
  • 网站服务公司名称wordpress头像尺寸
  • 织梦网站地图样式wordpress文章分类页面置顶
  • 建企业网站要多少钱杭州市城乡建设网官网
  • 怎么样建设一个网上教学网站wordpress优秀博客
  • 怎么免费创建个人网站公司宣传片制作价格
  • 9免费网站空间图片素材网站排行榜
  • 网站改版合同深圳百度关键字优化
  • wordpress网站安全性网页设计代码解释
  • 关于计算机网站开发的论文题目东莞市区最繁华的地方
  • 网站建设详细步骤设计师免费素材网站推荐
  • 钓鱼网站下载安装大连建设网网址
  • 设计软件网站推荐什么是网站框架结构
  • 公司网站后台怎么添加内容网站硬件方案
  • 专业做婚纱摄影网站手机网站 微网站
  • 免费注册企业网站陕西公共资源交易中心官网
  • 湖南网站seo营销多少费用网建科技北京有限公司