Java多线程同步:Synchronized块详解与示例

0 下载量 48 浏览量 更新于2024-08-31 收藏 65KB PDF 举报
在Java多线程编程中,Synchronized块同步方法是确保线程安全的重要手段,它利用`synchronized`关键字来控制并发访问。`synchronized`关键字可以用于方法或者代码块,其核心作用是提供互斥访问,即在同一时刻只有一个线程可以访问被锁定的代码区域。 首先,我们来看一个简单的例子,展示了不使用`synchronized`和使用`synchronized`时线程执行的差异。在这个例子中,`Example`类有一个名为`execute`的方法,如果没有添加`synchronized`,如`ThreadTest`中的`excute()`方法: ```java class Example { public void execute() { for (int i = 0; i < 5; ++i) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("excute:" + i); } } } class Thread1 extends Thread { private Example example; public Thread1(Example example) { this.example = example; } @Override public void run() { example.execute(); } } ``` 不使用`synchronized`时(即`execute()`方法),两个线程`Thread1`实例`t1`和`t2`同时调用`execute()`,由于没有锁保护,可能导致并发输出,可能出现以下结果: ``` excute:0 excute:0 excute:1 excute:1 excute:2 excute:2 excute:3 excute:3 excute:4 excute:4 ``` 这表明输出顺序不是线性进行的,而是交错的。 然而,当我们为`execute()`方法添加`synchronized`关键字: ```java public synchronized void execute() { // ... } ``` 这就意味着每次只有一个线程可以进入`execute()`方法。因此,输出结果将按照线程的执行顺序依次进行,例如: ``` excute:0 excute:1 excute:2 excute:3 excute:4 excute:0 excute:1 excute:2 excute:3 excute:4 ``` 这样就确保了在多线程环境下,同一时间只有一个线程执行该方法,避免了数据竞争和不一致状态。 接下来的例子可能会涉及到多个方法的同步,比如共享数据或者访问同一资源。在这种情况下,可以使用`synchronized`关键字来锁定特定的代码块或对象,确保这些操作的原子性和一致性。例如,如果你有多个方法都需要保护同一个共享变量,可以将锁定范围扩大到该变量所在的上下文,而不是仅限于单个方法。 总结来说,Synchronized块同步方法在Java多线程编程中扮演着至关重要的角色,通过锁定机制实现了线程间的协调,确保了数据的一致性和程序的正确性。理解并熟练运用`synchronized`关键字是编写高效、无竞态条件的并发代码的关键。