Java线程同步的必要性:同步时多线程串行执行,为何还要创建多线程?
多线程与同步的意义解析
首先要纠正你代码里的一个关键误解:你给main方法加synchronized完全起不到让子线程串行执行的作用。synchronized修饰方法时,锁的是当前对象(静态方法锁的是类对象),但你的两个子线程Myclass1和Myclass2的run方法并没有使用同一把锁,它们的执行不受main方法同步块的约束——你看到的“依次执行”只是线程调度的巧合,本质上这两个线程依然是并发运行的。
同步(Synchronization)的真正作用
同步不是为了让所有线程串行,而是保护共享资源的一致性。当多个线程需要读写同一个共享变量、操作同一个共享对象时,同步能保证同一时间只有一个线程进入临界区(访问共享资源的代码块),避免出现数据竞争导致的错误。但线程的其他非共享逻辑依然可以并发执行。
多线程的核心意义
即使存在同步,多线程依然有不可替代的价值:
- 利用多核CPU并行能力:单线程只能占用一个CPU核心,多线程可以同时利用多个核心,大幅提升计算密集型任务的效率。比如同时处理多个独立的计算任务,或者一个线程做IO操作(读写文件、网络请求)时,另一个线程可以同时执行计算,不用等待IO完成。
- 提升程序响应性:在UI应用中,主线程负责界面渲染,如果把耗时操作(比如下载文件、复杂计算)放在主线程,界面会卡顿。用后台线程处理耗时任务,主线程可以保持响应,提升用户体验。
- 拆分复杂任务:把一个大任务拆分为多个小任务,分配给不同线程并行处理,缩短整体执行时间。
正确的同步+多线程示例
比如两个线程操作同一个计数器,同步只保护计数器的递增操作,线程的其他逻辑依然并发:
class Counter { private int count = 0; // 同步方法,保护count的递增操作 public synchronized void increment() { count++; System.out.println("当前计数: " + count + ",线程: " + Thread.currentThread().getName()); } } class CountThread extends Thread { private Counter counter; public CountThread(Counter counter) { this.counter = counter; } @Override public void run() { for (int i = 0; i < 5; i++) { // 只有临界区(increment方法)是串行的,循环、sleep等逻辑依然并发 counter.increment(); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Driver { public static void main(String[] args) { Counter counter = new Counter(); CountThread t1 = new CountThread(counter); CountThread t2 = new CountThread(counter); t1.start(); t2.start(); } }
这个例子中,同步只限制了计数器的修改,线程的循环、休眠等操作依然并行执行,既保证了数据安全,又发挥了多线程的优势。
总结
同步是为了安全地共享资源,而非让所有线程串行;多线程的意义在于并发执行独立任务、利用多核资源、提升响应性。只要同步的范围控制在必要的临界区,多线程就能在保证数据安全的同时,大幅提升程序的效率。
内容的提问来源于stack exchange,提问作者Ghayathri_Thangadurai
相关产品推荐
相关产品推荐

