详解Java多线程与并发攻略
Java多线程与并发是Java编程中非常重要的一个部分,它可以提高程序的效率和运行速度。本文将详细介绍Java多线程与并发的相关知识和技巧。包括线程创建、线程安全、synchronized关键字、volatile关键字等。
线程创建
Java创建线程的方法有两种:
- 继承Thread类并重写run()方法。
示例代码:
public class MyThread extends Thread {
@Override
public void run() {
// 线程执行代码逻辑
}
}
- 实现Runnable接口并重写run()方法。
示例代码:
public class MyRunnable implements Runnable {
@Override
public void run() {
// 线程执行代码逻辑
}
}
线程安全
多线程环境下,共享资源容易出现问题。可能会出现数据不一致、线程安全问题等。为了解决这些问题,Java提供了synchronized关键字和volatile关键字。
synchronized关键字
synchronized关键字用于保证同步访问共享资源。
示例代码:
class MyCounter {
private int count = 0;
public synchronized void add() {
count++;
}
public synchronized void dec() {
count--;
}
public synchronized int getCount() {
return count;
}
}
volatile关键字
volatile关键字用于保证可见性和有序性。
示例代码:
class MySharedData {
volatile boolean ready = false;
volatile int value = 0;
}
示例说明
示例1
创建一个程序,让两个线程同时执行,打印出1~100的数字。其中一个线程只打印奇数,另一个线程只打印偶数。
示例代码:
public class MyThreadDemo {
public static void main(String[] args) {
MyCounter counter = new MyCounter();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 100; i += 2) {
counter.add();
System.out.println(Thread.currentThread().getName() + ": " + counter.getCount());
}
}
}, "OddThread");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 2; i <= 100; i += 2) {
counter.add();
System.out.println(Thread.currentThread().getName() + ": " + counter.getCount());
}
}
}, "EvenThread");
t1.start();
t2.start();
}
}
在该示例中,两个线程各自加锁,保证了线程安全。
示例2
创建一个程序,使用volatile关键字保证并发访问MySharedData类中的变量。
示例代码:
public class MyVolatileDemo {
public static void main(String[] args) {
MySharedData data = new MySharedData();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
while (!data.ready) {
// 等待data变量被其他线程更新
}
System.out.println(Thread.currentThread().getName() + ": " + data.value);
}
}, "ReadThread");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
// 更新data变量
data.value = 100;
data.ready = true;
}
}, "WriteThread");
t1.start();
t2.start();
}
}
在该示例中,通过使用volatile关键字,保证了线程间变量的可见性和有序性,从而避免了可能出现的问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java多线程与并发 - Python技术站