38、volatile 的作用是保证多线程环境下的可见性和禁止指令重排。应用场景包括:
- 多个线程对同一个变量进行读写操作,需要保证每次读取到的是最新的值;
- 多个线程对同一个变量进行修改操作,需要保证每个线程修改后的值都能被其他线程看到。
代码示例:
public class VolatileExample {
private volatile int count = 0;
public void increment() {
for (int i = 0; i < 1000000; i++) {
count++;
}
}
public int getCount() {
return count;
}
}
39、代码会重排序是因为编译器和处理器在执行过程中会对代码进行优化,可能会改变代码的顺序。
40、wait 和 sleep 方法的不同在于,wait 方法会让当前线程等待指定的时间后再继续执行,而 sleep 方法会让当前线程暂停一段时间后再继续执行。
代码示例:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
// do something
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
// wait for thread to finish
thread.join();
42、共享数据可以使用 synchronized 或者 Lock 来实现。synchronized 是 Java 中最基本的同步机制,Lock 则是一种更灵活的同步机制,可以控制锁的获取和释放。
代码示例:
private Object lock = new Object();
public void shareData(Object data) {
synchronized (lock) {
// shared data is accessed by multiple threads
System.out.println("Accessing shared data");
data.add(1);
}
}
43、notify 和 notifyAll 的区别在于,notify 只会通知一个线程,而 notifyAll 会通知所有等待该对象锁的线程。
代码示例:
private Object lock = new Object();
public void notify() {
synchronized (lock) {
// only one thread will be notified
System.out.println("Notifying thread");
}
}
public void notifyAll() {
synchronized (lock) {
// all waiting threads will be notified
System.out.println("Notifying all threads");
}
}
44、wait、notify 和 notifyAll 不在 Thread 类里面是因为它们是接口,而不是具体的方法。这些方法是由 Object 类中的 wait()、notify() 和 notifyAll() 实现的。
45、ThreadLocal 变量是一种线程局部变量,它可以让每个线程拥有自己的变量副本,避免了线程安全问题。
代码示例:
public class ThreadLocalExample {
private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
public static void setValue(int value) {
threadLocal.set(value);
}
public static int getValue() {
return threadLocal.get();
}