java多线程的同步方法实例代码
Java多线程同步是解决并发编程中线程不安全问题的关键技术。在上述代码示例中,展示了在没有同步机制的情况下,多线程操作共享数据可能导致的错误。具体来说,当我们有两个线程`t1`和`t2`同时访问并修改同一个银行账户(`Bank`类的`sum`变量)时,由于线程之间的交替执行,可能会出现数据不一致的情况,如输出的`sum`值不符合预期。 为了解决这个问题,Java提供了多种同步机制,包括同步代码块(Synchronized Block)和同步方法(Synchronized Method)。 ### 1. 同步代码块 同步代码块通过`synchronized`关键字和一个对象锁来实现。在这个例子中,我们将`Bank`类的实例`this`作为锁对象,确保同一时间只有一个线程能够执行`add`方法: ```java public void add(int num) { synchronized (this) { sum = sum + num; try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("total num is : " + sum); } } ``` 在这个同步代码块内,线程在进入前需要获取`this`对象的锁,如果其他线程已经持有该锁,那么该线程将会被阻塞,直到锁被释放。这样,同一时间只有一个线程能够执行`add`方法,保证了线程安全。 ### 2. 同步方法 同步方法是另一种同步机制,它通过在方法声明上添加`synchronized`关键字来实现。这样,整个方法的执行过程被视为一个临界区,同一时间只有一个线程能执行该方法: ```java public synchronized void add(int num) { sum = sum + num; try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("total num is : " + sum); } ``` 在这个例子中,`add`方法被声明为同步方法,这意味着每次只有一个线程能够执行该方法,其他线程需要等待当前线程完成执行。 ### 3. 锁对象的选择 在同步代码块中,我们可以选择任何对象作为锁,不一定是当前类的实例。例如,可以创建一个单独的`Object`实例作为锁: ```java private static final Object obj = new Object(); public void add(int num) { synchronized (obj) { // ... } } ``` 这样做的好处是可以让不同类的实例共享同一把锁,从而控制对共享资源的访问。 ### 4. 注意事项 虽然同步机制能够保证线程安全,但过度使用同步可能导致性能下降,因为线程可能会长时间等待获取锁。此外,同步并不解决所有的并发问题,例如死锁、活锁和饥饿等问题,还需要结合其他并发控制机制来解决。 ### 5. 其他同步机制 除了上述两种基本的同步机制,Java还提供了其他高级并发工具,如`java.util.concurrent`包中的`Semaphore`(信号量)、`ReentrantLock`(可重入锁)等,这些工具提供了更灵活的控制方式,可以在满足特定需求的同时提高并发性能。 理解和正确使用Java的多线程同步机制是编写高效并发程序的基础,程序员需要根据实际场景选择合适的同步策略,以保证程序的正确性和性能。
- 粉丝: 3
- 资源: 973
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助