天天看点

Java 编程下的同步代码块

为了便于理解先来看看没有加同步代码块的 2 组同样功能的代码在不同状态下的执行结果,下面看第一组:

package cn.sunzn.synchronize;

public class synchronizecode {

   public static void main(string[] args) {

       new thread() {

           public void run() {

               while (true) {

                   system.out.println("同步代码");

               }

           };

       }.start();

                   system.out.println("synchronizecode");

   }

}

第一组代码运行结果:

synchronizecode

同步代码

下面再来看第 2 组代码:

                   system.out.print("同步");

                   system.out.println("代码");

                   system.out.print("synchronize");

                   system.out.println("code");

第二组代码运行结果:

同步code

显然,第二组代码中同一个线程下的打印输出并没有同时执行,这是因为 cpu 在不同的线程间进行切换时的随机性导致的。第二组代码中的输出结果“同步code”是因为 cpu 切换到线程 1 的时候打印输出“同步”,但是当程序正准备打印“代码”的时候,cup 切换到了线程 2 打印输出“code”, 然后线程 2 继续持有 cpu 资源进行打印输出,知道 cpu 切换到线程 1。正因为这样的原因,当程序中包含有多个线程时,导致了同一个线程下的代码不能同时被执行。那么,我们如何才能保证这样的情况不发生呢?使用同步代码 块。下面我们来看使用了同步代码块程序的运行结果:

       /************ 创建锁对象 ************/

       final object lock = new object();

       /************ 开启线程一 ************/

                   synchronized (lock) {

                       system.out.print("同步");

                       system.out.println("代码");

                   }

       /************ 开启线程二 ************/

                       system.out.print("synchronize");

                       system.out.println("code");

运行上面的代码我们会发现运行结果和第一组代码的运行结果类似,这是因为使用了相同锁对象的同步代码块具有原子性,在进行执行的时候会持续的拥有 cpu 资源直到同步代码块执行完毕,要么继续持有 cpu 资源,要么 cpu 切换到到另一个线程,这样保证了在执行一组代码的时候不会有其他线程插入执行。