从项目中谈JAVA中static 方法在多线程环境下的运用

最近在做一个实时性比较高的系统,数据库访问很频繁。在这个项目中数据库访问的大多数都被我做成了static 方法。(这样做应该不是很好,没办法发挥dao模式的优势,不过凑合用吧)因这个系统是多线程。static方法的运用需要注意,不能在servlet中使用成员变量,因为如果你的servlet使用的是多线程模式,所有的servlet共享一个servlet实例,在多线程的情况下,会发生脏读问题;主要不能对类成员的同步访问。如果是方法的局部成员则是线程安全的。

总的说: 如果这个方法用的很频繁,就把它定义为static,需要注意的是线程间共享变量的同步。比如:线程不安全的数据结构 。

static的方法好处就是,在使用时速度快,不需要实例化对象就可以直接调用。在硬件有限,实时性要求比较高的情况下,应该提倡多用吧。

 

有空得了解下sun的java体系设计的思想,是static还是不是static,这是个问题!!

<think>好的,我需要回答用户关于Java多线程编程的使用示例及最佳实践的问题。首先,用户提供了三个引用,我需要参考这些内容。引用[1]提到使用java.util.concurrent包中的工具类,比如ExecutorService、BlockingQueue等,还提到了不可变对象。引用[2]和[3]则介绍了通过继承Thread类和实现Runnable接口来创建线程的方法。 用户的需求是了解多线程的使用方法和应用场景,所以我的回答需要涵盖基础用法和高级实践。基础部分应该包括Thread、Runnable和Callable的使用示例,而高级部分可以介绍线程池、并发工具类以及最佳实践,比如避免锁竞争、使用不可变对象等。 我需要确保结构清晰,分步骤讲解。首先介绍创建线程的三种方式,然后讲线程池的使用,接着是并发工具类的示例,最后是应用场景和最佳实践。同时,要注意引用对应的参考文献,比如在提到ExecutorService时引用[1],在Thread类部分引用[2]和[3]。 另外,用户可能对代码示例感兴趣,所以每个部分都要有简洁的代码片段。例如,Thread和Runnable的示例可以从引用[3]中提取,Callable可以补充一个FutureTask的例子。线程池部分使用引用[1]中的ExecutorService示例。并发工具类比如CountDownLatch需要自己构造一个例子说明用法。 应用场景方面,可以提到高并发服务器、批量处理、异步任务等,这些是多线程的典型用途。最佳实践部分要强调使用线程池而非直接创建线程,避免同步问题,使用不可变对象等,这些在引用[1]中都有提到。 最后,生成相关问题时要围绕多线程的基础、高级特性、问题排查和应用场景,确保问题能够帮助用户进一步深入学习。 现在整理这些思路,组织成结构化的回答,确保每个部分都有代码示例和对应的引用标注,同时语言要口语化,避免使用Markdown格式。</think>### Java多线程编程使用示例及最佳实践 #### 一、基础线程实现方法 1. **继承Thread类** 通过重写`run()`方法定义线程逻辑,调用`start()`启动线程[^3]: ```java public class MyThread extends Thread { @Override public void run() { System.out.println("Thread ID: " + Thread.currentThread().getId()); } public static void main(String[] args) { new MyThread().start(); } } ``` 2. **实现Runnable接口** 更推荐的方式,避免单继承限制[^2]: ```java public class MyRunnable implements Runnable { @Override public void run() { System.out.println("Runnable线程: " + Thread.currentThread().getName()); } public static void main(String[] args) { new Thread(new MyRunnable()).start(); } } ``` 3. **Callable+FutureTask(带返回值)** ```java FutureTask<Integer> task = new FutureTask<>(() -> { Thread.sleep(1000); return 123; }); new Thread(task).start(); System.out.println("计算结果: " + task.get()); // 阻塞获取结果 ``` #### 二、线程池最佳实践(引用[1]) 使用`ExecutorService`管理线程资源: ```java ExecutorService executor = Executors.newFixedThreadPool(5); for (int i = 0; i < 10; i++) { executor.submit(() -> { System.out.println("任务执行于: " + Thread.currentThread().getName()); }); } executor.shutdown(); ``` #### 三、并发工具类应用 1. **CountDownLatch(任务协调)** ```java CountDownLatch latch = new CountDownLatch(3); IntStream.range(0,3).forEach(i -> new Thread(() -> { System.out.println("子任务完成"); latch.countDown(); }).start()); latch.await(); // 等待所有子任务完成 System.out.println("主线程继续执行"); ``` 2. **ConcurrentHashMap(线程安全容器)** ```java ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>(); map.put("key", 10); map.computeIfPresent("key", (k,v) -> v+1); ``` #### 四、最佳实践建议 1. **优先使用线程池** 避免直接`new Thread()`创建线程,防止资源耗尽[^1] 2. **减少锁竞争** 使用`ReentrantLock`替代`synchronized`,或采用无锁数据结构: ```java AtomicInteger counter = new AtomicInteger(0); counter.incrementAndGet(); ``` 3. **不可变对象策略** 使用`final`字段和防御性拷贝保证线程安全[^1]: ```java public final class ImmutableObject { private final int value; public ImmutableObject(int value) { this.value = value; } public int getValue() { return value; } } ``` #### 五、典型应用场景 1. Web服务器(Tomcat使用线程池处理请求) 2. 大数据批量处理(多线程并行计算) 3. 异步任务处理(如邮件发送、日志记录) 4. 实时数据采集与处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值