Java 简介
Java 是一种广泛使用的高级编程语言,具有跨平台、面向对象、健壮性等特点。由 Sun Microsystems(现为 Oracle 公司)于 1995 年发布,广泛应用于企业级开发、移动应用(Android)、大数据处理等领域。
Java 核心特性
- 跨平台性:通过 JVM(Java 虚拟机)实现"一次编写,到处运行"。
- 面向对象:支持封装、继承、多态等特性。
- 自动内存管理:通过垃圾回收机制(GC)管理内存。
- 丰富的标准库:提供集合框架、IO、网络编程等工具。
基础语法示例
java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Java 开发环境
- JDK(Java Development Kit):包含编译器(javac)、JRE 和开发工具。
- IDE:推荐 IntelliJ IDEA、Eclipse 或 VS Code 配合插件。
学习资源
- 官方文档:Oracle Java Docs
- 书籍:《Java 核心技术》《Effective Java》
- 在线课程:Coursera、Udemy 等平台的 Java 入门教程。
应用场景
- 后端开发(Spring Boot)
- Android 应用开发
- 大数据工具(Hadoop、Spark)
- 嵌入式系统
多线程与集合框架
多线程基础
多线程允许程序同时执行多个任务,提高资源利用率和响应速度。Java通过Thread类和Runnable接口实现多线程。线程生命周期包括新建、就绪、运行、阻塞和终止状态。
创建线程的方式有两种:继承Thread类或实现Runnable接口。推荐使用Runnable接口,避免单继承限制。
java
// 实现Runnable接口
class MyRunnable implements Runnable {
public void run() {
System.out.println("Thread running");
}
}
// 启动线程
Thread thread = new Thread(new MyRunnable());
thread.start();
线程同步
多线程环境下共享资源可能导致数据不一致。使用synchronized关键字或Lock接口实现同步。
java
// 使用synchronized方法
class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
}
// 使用ReentrantLock
Lock lock = new ReentrantLock();
lock.lock();
try {
// 临界区代码
} finally {
lock.unlock();
}
集合框架概述
Java集合框架提供了一套接口和类,用于存储和操作数据。主要接口包括Collection、List、Set、Queue和Map。
List:有序可重复,如ArrayList和LinkedListSet:无序不可重复,如HashSet和TreeSetQueue:队列,如PriorityQueueMap:键值对,如HashMap和TreeMap
线程安全集合
标准集合类如ArrayList和HashMap不是线程安全的。多线程环境下可以使用以下替代方案:
Vector和Hashtable:早期线程安全实现,性能较差Collections.synchronizedList():包装非线程安全集合ConcurrentHashMap:高性能并发MapCopyOnWriteArrayList:读多写少场景适用
java
// 使用ConcurrentHashMap
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1);
// 使用CopyOnWriteArrayList
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("item");
并发工具类
Java并发包(java.util.concurrent)提供高级并发工具:
ExecutorService:线程池管理CountDownLatch:等待多个线程完成CyclicBarrier:线程同步点Semaphore:控制资源访问
java
// 使用线程池
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.submit(() -> System.out.println("Task running"));
executor.shutdown();
// 使用CountDownLatch
CountDownLatch latch = new CountDownLatch(3);
new Thread(() -> {
// 工作
latch.countDown();
}).start();
latch.await(); // 等待所有线程完成
最佳实践
- 优先使用并发集合而非同步包装器
- 避免过度同步,缩小同步范围
- 考虑使用不可变对象共享数据
- 利用线程池管理线程生命周期
- 使用
ThreadLocal维护线程特有数据
多线程编程需要特别注意线程安全和性能平衡,合理选择同步策略和集合类型是关键。