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

电影网站建设成本河南最新任命12个厅级

电影网站建设成本,河南最新任命12个厅级,东营网站建设tt0546,社交网络营销的特点Java面试知识点(全) 导航#xff1a; https://nanxiang.blog.csdn.net/article/details/130640392 注#xff1a;随时更新 多线程解决什么问题 CPU、内存、I/O 设备的速度是有极大差异的#xff0c;为了合理利用 CPU 的高性能#xff0c;平衡这三者的速度差异#xff0c…Java面试知识点(全) 导航 https://nanxiang.blog.csdn.net/article/details/130640392 注随时更新 多线程解决什么问题 CPU、内存、I/O 设备的速度是有极大差异的为了合理利用 CPU 的高性能平衡这三者的速度差异计算机体系结构、操作系统、编译程序都做出了贡献主要体现为: CPU 增加了缓存以均衡与内存的速度差异// 导致可见性问题 操作系统增加了进程、线程以分时复用 CPU进而均衡 CPU 与 I/O 设备的速度差异// 导致原子性问题 编译程序优化指令执行次序使得缓存能够得到更加合理地利用。// 导致有序性问题# Java怎么解决并发问题 理解的第一个维度核心知识点 JMM本质上可以理解为Java 内存模型规范了 JVM 如何提供按需禁用缓存和编译优化的方法。具体来说这些方法包括 volatile、synchronized 和 final 三个关键字 Happens-Before 规则 理解的第二个维度可见性有序性原子性 原子性 在Java中对基本数据类型的变量的读取和赋值操作是原子性操作即这些操作是不可被中断的要么执行要么不执行 Java内存模型只保证了基本读取和赋值是原子性操作如果要实现更大范围操作的原子性可以通过synchronized和Lock来实现。由于synchronized和Lock能够保证任一时刻只有一个线程执行该代码块那么自然就不存在原子性问题了从而保证了原子性。 可见性 Java提供了volatile关键字来保证可见性。 当一个共享变量被volatile修饰时它会保证修改的值会立即被更新到主存当有其他线程需要读取时它会去内存中读取新值。 而普通的共享变量不能保证可见性因为普通共享变量被修改之后什么时候被写入主存是不确定的当其他线程去读取时此时内存中可能还是原来的旧值因此无法保证可见性。 另外通过synchronized和Lock也能够保证可见性synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。 有序性 在Java里面可以通过volatile关键字来保证一定的“有序性”。另外可以通过synchronized和Lock来保证有序性很显然synchronized和Lock保证每个时刻是有一个线程执行同步代码相当于是让线程顺序执行同步代码自然就保证了有序性。当然JMM是通过Happens-Before 规则来保证有序性的。 怎么解决线程安全 互斥同步 synchronized 和 ReentrantLock。非阻塞同步 互斥同步最主要的问题就是线程阻塞和唤醒所带来的性能问题因此这种同步也称为阻塞同步。 互斥同步属于一种悲观的并发策略总是认为只要不去做正确的同步措施那就肯定会出现问题。无论共享数据是否真的会出现竞争它都要进行加锁(这里讨论的是概念模型实际上虚拟机会优化掉很大一部分不必要的加锁)、用户态核心态转换、维护锁计数器和检查是否有被阻塞的线程需要唤醒等操作。 CAS 随着硬件指令集的发展我们可以使用基于冲突检测的乐观并发策略: 先进行操作如果没有其它线程争用共享数据那操作就成功了否则采取补偿措施(不断地重试直到成功为止)。这种乐观的并发策略的许多实现都不需要将线程阻塞因此这种同步操作称为非阻塞同步。 乐观锁需要操作和冲突检测这两个步骤具备原子性这里就不能再使用互斥同步来保证了只能靠硬件来完成。硬件支持的原子性操作最典型的是: 比较并交换(Compare-and-SwapCAS)。CAS 指令需要有 3 个操作数分别是内存地址 V、旧的预期值 A 和新值 B。当执行操作时只有当 V 的值等于 A才将 V 的值更新为 B。 AtomicInteger J.U.C 包里面的整数原子类 AtomicInteger其中的 compareAndSet() 和 getAndIncrement() 等方法都使用了 Unsafe 类的 CAS 操作。 无同步方案 要保证线程安全并不是一定就要进行同步。如果一个方法本来就不涉及共享数据那它自然就无须任何同步措施去保证正确性。 栈封闭 多个线程访问同一个方法的局部变量时不会出现线程安全问题因为局部变量存储在虚拟机栈中属于线程私有的。线程本地存储(Thread Local Storage) 如果一段代码中所需要的数据必须与其他代码共享那就看看这些共享数据的代码是否能保证在同一个线程中执行。如果能保证我们就可以把共享数据的可见范围限制在同一个线程之内这样无须同步也能保证线程之间不出现数据争用的问题。 线程状态和转变 新建(New) 创建后尚未启动。可运行(Runnable) 可能正在运行也可能正在等待 CPU 时间片。 包含了操作系统线程状态中的 Running 和 Ready。阻塞(Blocking) 等待获取一个排它锁如果其线程释放了锁就会结束此状态。无限期等待(Waiting) 等待其它线程显式地唤醒否则不会被分配 CPU 时间片。 进入方法 退出方法 没有设置 Timeout 参数的 Object.wait() 方法 Object.notify() / Object.notifyAll() 没有设置 Timeout 参数的 Thread.join() 方法 被调用的线程执行完毕 LockSupport.park() 方法 - 限期等待(Timed Waiting) 无需等待其它线程显式地唤醒在一定时间之后会被系统自动唤醒。 调用 Thread.sleep() 方法使线程进入限期等待状态时常常用“使一个线程睡眠”进行描述不会释放锁。 调用 Object.wait() 方法使线程进入限期等待或者无限期等待时常常用“挂起一个线程”进行描述会释放锁。 睡眠和挂起是用来描述行为而阻塞和等待用来描述状态。 阻塞和等待的区别在于阻塞是被动的它是在等待获取一个排它锁。而等待是主动的通过调用 Thread.sleep() 和 Object.wait() 等方法进入。 进入方法 退出方法 Thread.sleep() 方法 时间结束 设置了 Timeout 参数的 Object.wait() 方法 时间结束 / Object.notify() / Object.notifyAll() 设置了 Timeout 参数的 Thread.join() 方法 时间结束 / 被调用的线程执行完毕 LockSupport.parkNanos() 方法 - LockSupport.parkUntil() 方法 - 死亡(Terminated) 可以是线程结束任务之后自己结束或者产生了异常而结束。 守护线程 Daemon 守护线程是程序运行时在后台提供服务的线程不属于程序中不可或缺的部分。 当所有非守护线程结束时程序也就终止同时会杀死所有守护线程。 main() 属于非守护线程。使用 setDaemon() 方法将一个线程设置为守护线程。 线程的中断方式 一个线程执行完毕之后会自动结束如果在运行过程中发生异常也会提前结束。 InterruptedException 通过调用一个线程的 interrupt() 来中断该线程如果该线程处于阻塞、限期等待或者无限期等待状态那么就会抛出 InterruptedException从而提前结束该线程。但是不能中断 I/O 阻塞和 synchronized 锁阻塞。 对于以下代码在 main() 中启动一个线程之后再中断它由于线程中调用了 Thread.sleep() 方法因此会抛出一个 InterruptedException从而提前结束线程不执行之后的语句。 interrupted() 如果一个线程的 run() 方法执行一个无限循环并且没有执行 sleep() 等会抛出 InterruptedException 的操作那么调用线程的 interrupt() 方法就无法使线程提前结束。 但是调用 interrupt() 方法会设置线程的中断标记此时调用 interrupted() 方法会返回 true。因此可以在循环体中使用 interrupted() 方法来判断线程是否处于中断状态从而提前结束线程。 Executor 的中断操作 调用 Executor 的 shutdown() 方法会等待线程都执行完毕之后再关闭但是如果调用的是 shutdownNow() 方法则相当于调用每个线程的 interrupt() 方法。 线程间协作 join() 在线程中调用另一个线程的 join() 方法会将当前线程挂起而不是忙等待直到目标线程结束。 对于以下代码虽然 b 线程先启动但是因为在 b 线程中调用了 a 线程的 join() 方法b 线程会等待 a 线程结束才继续执行因此最后能够保证 a 线程的输出先于 b 线程的输出。 public class JoinExample {private class A extends Thread {Overridepublic void run() {System.out.println(A);}}private class B extends Thread {private A a;B(A a) {this.a a;}Overridepublic void run() {try {a.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(B);}}public void test() {A a new A();B b new B(a);b.start();a.start();}public static void main(String[] args) {JoinExample example new JoinExample();example.test();} } //结果 A B wait() notify() notifyAll() 调用 wait() 使得线程等待某个条件满足线程在等待时会被挂起当其他线程的运行使得这个条件满足时其它线程会调用 notify() 或者 notifyAll() 来唤醒挂起的线程。 它们都属于 Object 的一部分而不属于 Thread。 只能用在同步方法或者同步控制块中使用否则会在运行时抛出 IllegalMonitorStateExeception。 使用 wait() 挂起期间线程会释放锁。这是因为如果没有释放锁那么其它线程就无法进入对象的同步方法或者同步控制块中那么就无法执行 notify() 或者 notifyAll() 来唤醒挂起的线程造成死锁。 wait() 和 sleep() 的区别 wait() 是 Object 的方法而 sleep() 是 Thread 的静态方法 wait() 会释放锁sleep() 不会。 样例 public class WaitNotifyCase {public static void main(String[] args) {final Object lock new Object();new Thread(new Runnable() {Overridepublic void run() {synchronized (lock) {try {TimeUnit.SECONDS.sleep(1);lock.wait();System.out.println(execute thread 1);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();new Thread(new Runnable() {Overridepublic void run() {synchronized (lock) {try {TimeUnit.SECONDS.sleep(5);System.out.println(execute thread 2);} catch (InterruptedException e) {e.printStackTrace();}lock.notify();}}}).start();} } await() signal() signalAll() java.util.concurrent 类库中提供了 Condition 类来实现线程之间的协调可以在 Condition 上调用 await() 方法使线程等待其它线程调用 signal() 或 signalAll() 方法唤醒等待的线程。相比于 wait() 这种等待方式await() 可以指定等待的条件因此更加灵活。 Synchronized作用域 对象锁 方法锁 类锁 Synchronized本质原理 Synchronized由JVM实现的。 加锁和释放锁的原理 深入JVM看字节码创建如下的代码 public class SynchronizedDemo {Object object new Object();public void method1() {synchronized (object) {}} }使用javac命令进行编译生成.class文件 vac SynchronizedDemo.java 使用javap命令反编译查看.class文件的信息 javap -verbose SynchronizedDemo.class 得到如下的信息 关注红色方框里的monitorenter和monitorexit即可。 Monitorenter和Monitorexit指令会让对象在执行使其锁计数器加1或者减1。每一个对象在同一时间只与一个monitor(锁)相关联而一个monitor在同一时间只能被一个线程获得一个对象在尝试获得与这个对象相关联的Monitor锁的所有权的时候monitorenter指令会发生如下3中情况之一 monitor计数器为0意味着目前还没有被获得那这个线程就会立刻获得然后把锁计数器1一旦1别的线程再想获取就需要等待如果这个monitor已经拿到了这个锁的所有权又重入了这把锁那锁计数器就会累加变成2并且随着重入的次数会一直累加这把锁已经被别的线程获取了等待锁释放 monitorexit指令释放对于monitor的所有权释放过程很简单就是讲monitor的计数器减1如果减完以后计数器不是0则代表刚才是重入进来的当前线程还继续持有这把锁的所有权如果计数器变成0则代表当前线程不再拥有该monitor的所有权即释放锁。 下图表现了对象对象监视器同步队列以及执行线程状态之间的关系 该图可以看出任意线程对Object的访问首先要获得Object的监视器如果获取失败该线程就进入同步状态线程状态变为BLOCKED当Object的监视器占有者释放后在同步队列中得线程就会有机会重新获取该监视器。 可重入原理加锁次数计数器 看如下的例子 public class SynchronizedDemo {public static void main(String[] args) {synchronized (SynchronizedDemo.class) {}method2();}private synchronized static void method2() {} }对应的字节码 public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: (0x0009) ACC_PUBLIC, ACC_STATICCode:stack2, locals3, args_size10: ldc #2 2: dup3: astore_14: monitorenter5: aload_16: monitorexit7: goto 1510: astore_211: aload_112: monitorexit13: aload_215: invokestatic #3 // Method method2:()VException table:from to target type5 7 10 any10 13 10 any上面的SynchronizedDemo中在执行完同步代码块之后紧接着再会去执行一个静态同步方法而这个方法锁的对象依然就这个类对象那么这个正在执行的线程还需要获取该锁吗? 答案是不必的从上图中就可以看出来执行静态同步方法的时候就只有一条monitorexit指令并没有monitorenter获取锁的指令。这就是锁的重入性即在同一锁程中线程不需要再次获取同一把锁。 Synchronized先天具有重入性。每个对象拥有一个计数器当线程获取该对象锁后计数器就会加一释放锁后就会将计数器减一。 保证可见性的原理内存模型和happens-before规则 Synchronized的happens-before规则即监视器锁规则对同一个监视器的解锁happens-before于对该监视器的加锁。继续来看代码 public class MonitorDemo {private int a 0;public synchronized void writer() { // 1a; // 2} // 3public synchronized void reader() { // 4int i a; // 5} // 6 }该代码的happens-before关系如图所示 在图中每一个箭头连接的两个节点就代表之间的happens-before关系黑色的是通过程序顺序规则推导出来红色的为监视器锁规则推导而出线程A释放锁happens-before线程B加锁蓝色的则是通过程序顺序规则和监视器锁规则推测出来happens-befor关系通过传递性规则进一步推导的happens-before关系。现在我们来重点关注2 happens-before 5通过这个关系我们可以得出什么? 根据happens-before的定义中的一条:如果A happens-before B则A的执行结果对B可见并且A的执行顺序先于B。线程A先对共享变量A进行加一由2 happens-before 5关系可知线程A的执行结果对线程B可见即线程B所读取到的a的值为1。 Synchronized使得同时只有一个线程可以执行性能比较差有什么提升的方法 简单来说在JVM中monitorenter和monitorexit字节码依赖于底层的操作系统的Mutex Lock来实现的但是由于使用Mutex Lock需要将当前线程挂起并从用户态切换到内核态来执行这种切换的代价是非常昂贵的然而在现实中的大部分情况下同步方法是运行在单线程环境(无锁竞争环境)如果每次都调用Mutex Lock那么将严重的影响程序的性能。不过在jdk1.6中对锁的实现引入了大量的优化如锁粗化(Lock Coarsening)、锁消除(Lock Elimination)、轻量级锁(Lightweight Locking)、偏向锁(Biased Locking)、适应性自旋(Adaptive Spinning)等技术来减少锁操作的开销。 锁粗化(Lock Coarsening)也就是减少不必要的紧连在一起的unlocklock操作将多个连续的锁扩展成一个范围更大的锁。锁消除(Lock Elimination)通过运行时JIT编译器的逃逸分析来消除一些没有在当前同步块以外被其他线程共享的数据的锁保护通过逃逸分析也可以在线程本地Stack上进行对象空间的分配(同时还可以减少Heap上的垃圾收集开销)。轻量级锁(Lightweight Locking)这种锁实现的背后基于这样一种假设即在真实的情况下我们程序中的大部分同步代码一般都处于无锁竞争状态(即单线程执行环境)在无锁竞争的情况下完全可以避免调用操作系统层面的重量级互斥锁取而代之的是在monitorenter和monitorexit中只需要依靠一条CAS原子指令就可以完成锁的获取及释放。当存在锁竞争的情况下执行CAS指令失败的线程将调用操作系统互斥锁进入到阻塞状态当锁被释放的时候被唤醒。偏向锁(Biased Locking)是为了在无锁竞争的情况下避免在锁获取过程中执行不必要的CAS原子指令因为CAS原子指令虽然相对于重量级锁来说开销比较小但还是存在非常可观的本地延迟。适应性自旋(Adaptive Spinning)当线程在获取轻量级锁的过程中执行CAS操作失败时在进入与monitor相关联的操作系统重量级锁(mutex semaphore)前会进入忙等待(Spinning)然后再次尝试当尝试一定的次数后如果仍然没有成功则调用与该monitor关联的semaphore(即互斥锁)进入到阻塞状态。 Synchronized锁升级 偏向锁:只有一个线程争抢锁资源的时候.将线程拥有者标识为当前线程. 轻量级锁(自旋锁):一个或多个线程通过CAS去争抢锁,如果抢不到则一直自旋. 重量级锁:多个线程争抢锁,向内核申请锁资源,将未争抢成功的锁放到队列中直接阻塞. 为什么要有锁的升级过程? 在最开始的时候,其实就是无锁直接到重量级锁,但是重量级锁需要向内核申请额外的锁资源,这就涉及到用户态和内核态的转换,比较浪费资源,而且大多数情况下,其实还是一个线程去争抢锁,完全不需要重量级锁. 锁升级 当只有一个线程去争抢锁的时候,会先使用偏向锁,就是给一个标识,说明现在这个锁被线程a占有. 后来又来了线程b,线程c,说凭什么你占有锁,需要公平的竞争,于是将标识去掉,也就是撤销偏向锁,升级为轻量级锁,三个线程通过CAS进行锁的争抢(其实这个抢锁过程还是偏向于原来的持有偏向锁的线程). 现在线程a占有了锁,线程b,线程c一直在循环尝试获取锁,后来又来了十个线程,一直在自旋,那这样等着也是干耗费CPU资源,所以就将锁升级为重量级锁,向内核申请资源,直接将等待的线程进行阻塞. Synchronized由什么样的缺陷? Java Lock是怎么弥补这些缺陷的? synchronized的缺陷 效率低锁的释放情况少只有代码执行完毕或者异常结束才会释放锁试图获取锁的时候不能设定超时不能中断一个正在使用锁的线程相对而言Lock可以中断和设置超时不够灵活加锁和释放的时机单一每个锁仅有一个单一的条件(某个对象)相对而言读写锁更加灵活无法知道是否成功获得锁相对而言Lock可以拿到状态 Lock解决相应问题 Lock类这里不做过多解释主要看里面的4个方法: lock(): 加锁unlock(): 解锁tryLock(): 尝试获取锁返回一个boolean值tryLock(long,TimeUtil): 尝试获取锁可以设置超时 Synchronized只有锁只与一个条件(是否获取锁)相关联不灵活后来Condition与Lock的结合解决了这个问题。 多线程竞争一个锁时其余未得到锁的线程只能不停的尝试获得锁而不能中断。高并发的情况下会导致性能下降。ReentrantLock的lockInterruptibly()方法可以优先考虑响应中断。 一个线程等待时间过长它可以中断自己然后ReentrantLock响应这个中断不再让这个线程继续等待。有了这个机制使用ReentrantLock时就不会像synchronized那样产生死锁了。 Synchronized和Lock的对比和选择 存在层次上 synchronized: Java的关键字在jvm层面上 Lock: 是一个接口锁的释放 synchronized: 1、以获取锁的线程执行完同步代码释放锁 2、线程执行发生异常jvm会让线程释放锁 Lock: 在finally中必须释放锁不然容易造成线程死锁锁的获取 synchronized: 假设A线程获得锁B线程等待。如果A线程阻塞B线程会一直等待 Lock: 分情况而定Lock有多个锁获取的方式大致就是可以尝试获得锁线程可以不用一直等待(可以通过tryLock判断有没有锁)锁的释放死锁产生 synchronized: 在发生异常时候会自动释放占有的锁因此不会出现死锁 Lock: 发生异常时候不会主动释放占有的锁必须手动unlock来释放锁可能引起死锁的发生锁的状态 synchronized: 无法判断 Lock: 可以判断锁的类型 synchronized: 可重入 不可中断 非公平 Lock: 可重入 可判断 可公平两者皆可性能 synchronized: 少量同步 Lock: 大量同步 Lock可以提高多个线程进行读操作的效率。可以通过readwritelock实现读写分离 在资源竞争不是很激烈的情况下Synchronized的性能要优于ReetrantLock但是在资源竞争很激烈的情况下Synchronized的性能会下降几十倍但是ReetrantLock的性能能维持常态 ReentrantLock提供了多样化的同步比如有时间限制的同步可以被Interrupt的同步synchronized的同步是不能Interrupt的等。在资源竞争不激烈的情形下性能稍微比synchronized差点点。但是当同步非常激烈的时候synchronized的性能一下子能下降好几十倍。而ReentrantLock确还能维持常态。调度 synchronized: 使用Object对象本身的wait 、notify、notifyAll调度机制 Lock: 可以使用Condition进行线程之间的调度用法 synchronized: 在需要同步的对象中加入此控制synchronized可以加在方法上也可以加在特定代码块中括号中表示需要锁的对象。 Lock: 一般使用ReentrantLock类做为锁。在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。底层实现 synchronized: 底层使用指令码方式来控制锁的映射成字节码指令就是增加来两个指令monitorenter和monitorexit。当线程执行遇到monitorenter指令时会尝试获取内置锁如果获取锁则锁计数器1如果没有获取锁则阻塞当遇到monitorexit指令时锁计数器-1如果计数器为0则释放锁。 Lock: 底层是CAS乐观锁依赖AbstractQueuedSynchronizer类把所有的请求线程构成一个CLH队列。而对该队列的操作均通过Lock-FreeCAS操作。 synchronized是公平锁吗 synchronized实际上是非公平的新来的线程有可能立即获得监视器而在等待区中等候已久的线程可能再次等待这样有利于提高性能但是也可能会导致饥饿现象。 参考文档https://www.pdai.tech/md/interview/x-interview.html 外传 原创不易如若本文能够帮助到您的同学支持我关注我点赞收藏⭐️留言探讨问题看到立马回复格言己所不欲勿施于人 扬帆起航、游历人生、永不言弃
文章转载自:
http://www.morning.fhkr.cn.gov.cn.fhkr.cn
http://www.morning.wjyyg.cn.gov.cn.wjyyg.cn
http://www.morning.xqwq.cn.gov.cn.xqwq.cn
http://www.morning.nbsfb.cn.gov.cn.nbsfb.cn
http://www.morning.qnywy.cn.gov.cn.qnywy.cn
http://www.morning.lfsmf.cn.gov.cn.lfsmf.cn
http://www.morning.npbnc.cn.gov.cn.npbnc.cn
http://www.morning.yubkwd.cn.gov.cn.yubkwd.cn
http://www.morning.bloao.com.gov.cn.bloao.com
http://www.morning.ypzsk.cn.gov.cn.ypzsk.cn
http://www.morning.mnmrx.cn.gov.cn.mnmrx.cn
http://www.morning.sqxr.cn.gov.cn.sqxr.cn
http://www.morning.lfpzs.cn.gov.cn.lfpzs.cn
http://www.morning.zgpgl.cn.gov.cn.zgpgl.cn
http://www.morning.lbpfl.cn.gov.cn.lbpfl.cn
http://www.morning.jncxr.cn.gov.cn.jncxr.cn
http://www.morning.lnbyk.cn.gov.cn.lnbyk.cn
http://www.morning.rttp.cn.gov.cn.rttp.cn
http://www.morning.fkgqn.cn.gov.cn.fkgqn.cn
http://www.morning.wmdlp.cn.gov.cn.wmdlp.cn
http://www.morning.qxkcx.cn.gov.cn.qxkcx.cn
http://www.morning.msbct.cn.gov.cn.msbct.cn
http://www.morning.fqcdh.cn.gov.cn.fqcdh.cn
http://www.morning.qgwdc.cn.gov.cn.qgwdc.cn
http://www.morning.byzpl.cn.gov.cn.byzpl.cn
http://www.morning.sjwzz.cn.gov.cn.sjwzz.cn
http://www.morning.xtxp.cn.gov.cn.xtxp.cn
http://www.morning.rgwz.cn.gov.cn.rgwz.cn
http://www.morning.ygztf.cn.gov.cn.ygztf.cn
http://www.morning.qljxm.cn.gov.cn.qljxm.cn
http://www.morning.pakistantractors.com.gov.cn.pakistantractors.com
http://www.morning.prls.cn.gov.cn.prls.cn
http://www.morning.mrccd.cn.gov.cn.mrccd.cn
http://www.morning.xkmrr.cn.gov.cn.xkmrr.cn
http://www.morning.nqnqz.cn.gov.cn.nqnqz.cn
http://www.morning.gkxyy.cn.gov.cn.gkxyy.cn
http://www.morning.jjhrj.cn.gov.cn.jjhrj.cn
http://www.morning.gcqkb.cn.gov.cn.gcqkb.cn
http://www.morning.lmqfq.cn.gov.cn.lmqfq.cn
http://www.morning.pkrtz.cn.gov.cn.pkrtz.cn
http://www.morning.nytpt.cn.gov.cn.nytpt.cn
http://www.morning.nbqwt.cn.gov.cn.nbqwt.cn
http://www.morning.wnhsw.cn.gov.cn.wnhsw.cn
http://www.morning.tgdys.cn.gov.cn.tgdys.cn
http://www.morning.wfttq.cn.gov.cn.wfttq.cn
http://www.morning.mwwnz.cn.gov.cn.mwwnz.cn
http://www.morning.bkppb.cn.gov.cn.bkppb.cn
http://www.morning.pbwcq.cn.gov.cn.pbwcq.cn
http://www.morning.nkkpp.cn.gov.cn.nkkpp.cn
http://www.morning.bynf.cn.gov.cn.bynf.cn
http://www.morning.mltsc.cn.gov.cn.mltsc.cn
http://www.morning.ntgsg.cn.gov.cn.ntgsg.cn
http://www.morning.qbzdj.cn.gov.cn.qbzdj.cn
http://www.morning.syqtt.cn.gov.cn.syqtt.cn
http://www.morning.wgxtz.cn.gov.cn.wgxtz.cn
http://www.morning.woyoua.com.gov.cn.woyoua.com
http://www.morning.xxhc.cn.gov.cn.xxhc.cn
http://www.morning.dlhxj.cn.gov.cn.dlhxj.cn
http://www.morning.fjptn.cn.gov.cn.fjptn.cn
http://www.morning.pghgq.cn.gov.cn.pghgq.cn
http://www.morning.tntgc.cn.gov.cn.tntgc.cn
http://www.morning.qzdxy.cn.gov.cn.qzdxy.cn
http://www.morning.nbnpb.cn.gov.cn.nbnpb.cn
http://www.morning.hlwzd.cn.gov.cn.hlwzd.cn
http://www.morning.ydzly.cn.gov.cn.ydzly.cn
http://www.morning.bzfwn.cn.gov.cn.bzfwn.cn
http://www.morning.tymnr.cn.gov.cn.tymnr.cn
http://www.morning.lyjwb.cn.gov.cn.lyjwb.cn
http://www.morning.gbxxh.cn.gov.cn.gbxxh.cn
http://www.morning.wcyr.cn.gov.cn.wcyr.cn
http://www.morning.snktp.cn.gov.cn.snktp.cn
http://www.morning.nsppc.cn.gov.cn.nsppc.cn
http://www.morning.pzss.cn.gov.cn.pzss.cn
http://www.morning.mxftp.com.gov.cn.mxftp.com
http://www.morning.mtqqx.cn.gov.cn.mtqqx.cn
http://www.morning.c7510.cn.gov.cn.c7510.cn
http://www.morning.ycmpk.cn.gov.cn.ycmpk.cn
http://www.morning.sfmqm.cn.gov.cn.sfmqm.cn
http://www.morning.kldtf.cn.gov.cn.kldtf.cn
http://www.morning.nlygm.cn.gov.cn.nlygm.cn
http://www.tj-hxxt.cn/news/249834.html

相关文章:

  • 重庆触摸屏 电子商务网站建设网站建设的功能和目标
  • 网站备案修改域名ipwordpress被植入广告
  • 学校网站建设情况介绍温州公司建设网站
  • vps网站助手网站脑图用什么做
  • 盐城网站建设与网页制作佛山网站公司建设网站
  • 郑州网站设静态网站做一单多少钱
  • 做百度手机网站快网页微博
  • 网站排名优化学习广东企业品牌网站建设价格
  • 网站开发参数怎么做网站的软文推广
  • 工业网站素材网站建设要学哪种计算机语言
  • 淘宝里网站建设公司可以吗外贸营销网站建设介绍
  • 卢松松网站源码国内哪家网站建设公司好
  • 企业网站的建设思维导图网站开发交接表
  • 如何做网站左侧导航条工业设计公司如何运营
  • 嘉兴企业网站制作为什么下载的文件是乱码怎么办
  • 广告设计案例网站律师个人网站源码
  • 站点-将网站添加到区域变灰色无法添加如何解决湖北省建设工程教育协会网站
  • 定制型网站建设合同范本环球快客外贸软件app下载
  • 网站建设的结构网站建设费记账
  • 南京站建设天河公司网站建设
  • 网站设计公司网站好的网络推广平台
  • 怎样推广海外网站石家庄网站建设咨询薇
  • 北京建筑设计公司有哪些黑帽seo关键词优化
  • 山东聊城网站建设京东网上商城女装
  • 免费建站体验网页游戏浏览器
  • 网站百度推广和优化什么是网络营销最重要的工具
  • asp.net做网站怎么样网站每天更新多少文章
  • 网站互动杭州网站开发培训
  • 服装移动网站策划案怎样把网站提交到百度
  • 网站页面图片赤峰建设厅官方网站