什么是同步代码块?

  • Post category:Java

以下是关于同步代码块的完整使用攻略:

同步代码块

同步代码块是指在多线程编程中,使用 synchronized 关键字来实现对共享资源的访控制的一种方式。同步代码块可以将需要同步的代码块包裹起来,从而保证同一时间只有一个线程可以访问共享资源,避免线程之间的竞争和冲突。

同步代码块的语法格式如下:

synchronized (object) {
    // 需要同步的代码块
}

其中,object 表示需要同步的对象,可以是任意对象。在同步代码块中,只有获取到 object 对象的锁的线程才能执行其中的代码,其他线程需要等待锁的释放才能执行。

同步代码块的示例

以下两个示例,分别演示了使用同步代码块实现对共享资源的访问控制的过程。

示例一:使用同步代码块实现对共享变量的访问控制

public class SynchronizedBlock {
    private int count = 0;
    private Object lock = new Object();

    public void increment() {
        synchronized (lock) {
            count++;
        }
    }

    public void decrement() {
        synchronized (lock) {
            count--;
        }
    }

    public int getCount() {
        return count;
    }

    public static void main(String[] args) {
        SynchronizedBlock synchronizedBlock = new SynchronizedBlock();

        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                synchronizedBlock.increment();
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                synchronizedBlock.decrement();
            }
        });

        thread1.start();
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Count: " + synchronizedBlock.getCount());
    }
}

在上面的代码中,定义了一个 SynchronizedBlock 类,用来实现对共享变量 count 的访问控制。在 increment() 和 decrement() 方法中,使用 synchronized 关键字来实现对 count 变量的访问控制。在 main() 方法中创建了两个线程 thread1 和 thread2,分别调用 increment() 和 decrement() 方法来对 count 变量进行加减操作。由于使用了同步代码块,就可以避免线程之间的竞争和冲突,从而保证程序正确性和稳定性。

示例二:使用同步代码块实现对共享对象的访问控制

public class SynchronizedObject {
    private List<Integer> list = new ArrayList<>();
    private Object lock = new Object();

    public void add(int value) {
        synchronized (lock) {
            list.add(value);
        }
    }

    public int get(int index) {
        synchronized (lock) {
            return list.get(index);
        }
    }

    public static void main(String[] args) {
        SynchronizedObject synchronizedObject = new SynchronizedObject();

        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                synchronizedObject.add(i);
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                int value = synchronizedObject.get(i);
                System.out.println("Thread 2 get value: " + value);
            }
        });

        thread1.start();
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在上面的代码中,定义了一个 SynchronizedObject 类,用来实现对共享对象 list 的访问控制。在 add() 和 get() 方法中,使用 synchronized 关键字来实现对 list 对象的访问控制。在 main() 方法中创建了两个线程 thread1 和 thread2,分别调用 add() 和 get() 方法来对 list 对象进行添加和获取操作。由于使用了同步代码块,就可以避免线程之间的竞争和冲突,从而保证程序的正确性和稳定性。

总结

同步代码块是指在多线程编程中,使用 synchronized 关键字来实现对共享资源的访控制的一种方式。同步代码块可以将需要同步的代码块包裹起来,从而保证同一时间只有一个线程可以访问共享资源,避免线程之间的竞争和冲突。在实际的开发中,需要根据具体情况选择合适的同步方式,从而保证程序的正确性和稳定性。