当前位置: 首页 > 图灵资讯 > 技术篇> 不同线程 传递变量 java

不同线程 传递变量 java

来源:图灵教育
时间:2023-08-30 09:19:11

不同线程 传递变量 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增加操作可能导致数据竞争,导致结果不正确。为了避免这种情况,我们可以使用锁定机制。

2. 锁机制

锁定机制可以确保只有一个线程可以同时访问共享变量,从而避免数据竞争。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类实际