不同线程 传递变量 Java
在多线程编程中,在不同的线程之间传输变量是很常见的。Java提供了多种实现这一目标的方法。本文将介绍几种常见的方法,并通过代码示例进行演示。
1. 共享变量最简单的方法是使用共享变量。共享变量是多线程中可见的变量,可同时访问和修改。Java中的基本数据类型和参考类型(如数组和对象)可用作共享变量。
以下是使用共享变量的示例代码:
public class SharedVariableExample { private static int count = 0; public static void main(String[] args) { Thread thread1 = new Thread(() -> { for (int i = 0; i < 1000; i++) { count++; } }); Thread thread2 = new Thread(() -> { for (int i = 0; i < 1000; i++) { count++; } }); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Count: " + count); }}
上述代码创建了两个线程,每个线程循环1000次,每个循环共享变量count
进行递增操作。最后输出count
值。因为两个线程同时对齐count
因此,最终的结果会受到线程之间的竞争关系的影响。
然而,共享变量存在线程安全问题。在上述示例中,由于两个线程同时对齐count
增加操作可能导致数据竞争,导致结果不正确。为了避免这种情况,我们可以使用锁定机制。
锁定机制可以确保只有一个线程可以同时访问共享变量,从而避免数据竞争。Java提供了synchronized关键字和Lock接口来实现锁定机制。
以下是使用synchronized的示例代码:
public class SynchronizedExample { private static int count = 0; public static void main(String[] args) { Object lock = new Object(); Thread thread1 = new Thread(() -> { synchronized (lock) { for (int i = 0; i < 1000; i++) { count++; } } }); Thread thread2 = new Thread(() -> { synchronized (lock) { for (int i = 0; i < 1000; i++) { count++; } } }); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Count: " + count); }}
上述代码使用共享对象lock
作为锁。通过每个线程synchronized (lock)
获取锁,以确保只有一个线程可以同时执行共享变量count
的操作。
除了synchronized关键字外,还可以使用lock接口来实现锁定机制。lock接口提供了更灵活的锁操作,如重新进入锁、公平锁等。以下是使用lock接口的示例代码:
import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class LockExample { private static int count = 0; private static Lock lock = new ReentrantLock(); public static void main(String[] args) { Thread thread1 = new Thread(() -> { lock.lock(); try { for (int i = 0; i < 1000; i++) { count++; } } finally { lock.unlock(); } }); Thread thread2 = new Thread(() -> { lock.lock(); try { for (int i = 0; i < 1000; i++) { count++; } } finally { lock.unlock(); } }); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Count: " + count); }}
上述代码使用ReentrantLock类实际