java -D 传递多个值

nohup java  -DXXXX=test -DXXXXX=localhost -jar XXX.jar > Log.log 2>&1 &

空格隔开,-D{KEY}={VALUE}  

### Java 多线程参数传递未更新解决方案 当遇到Java多线程环境中传入的参数未能及时更新的情况时,通常是因为多个线程间存在共享资源的竞争条件或是缺乏必要的同步措施。为了确保每个线程能够独立操作自己的数据副本而不影响其他线程的数据状态,可以采用`ThreadLocal`来存储特定于当前执行线程的变量实例。 #### 使用 `ThreadLocal` 实现线程安全的参数管理 通过创建一个继承自`ThreadLocal<T>`类的对象,并重写其内部方法以初始化所需的默认,在每次访问该对象时都会返回专属于调用它的那个线程所持有的。这样就有效避免了不同线程之间的干扰问题[^1]。 下面是一个简单的例子展示如何利用`ThreadLocal`解决多线程下参数不被正确更新的问题: ```java public class ThreadSafeParameter { private static final ThreadLocal<Integer> threadLocalValue = new ThreadLocal<>(); public void set(int value){ System.out.println(Thread.currentThread().getName() + " setting value to "+value); threadLocalValue.set(value); // 设置本地线程变量 } public int get(){ Integer result = threadLocalValue.get(); if(result == null){ throw new IllegalStateException("No value found for this thread"); } return result; } public static void main(String[] args)throws InterruptedException{ final ThreadSafeParameter tsp = new ThreadSafeParameter(); Runnable task = ()->{ try { int localVal = (int)(Math.random()*10)+1; // 随机生成一个整数作为测试输入 tsp.set(localVal); TimeUnit.SECONDS.sleep(2); // 模拟耗时处理过程 System.out.printf("%s has value %d%n", Thread.currentThread().getName(),tsp.get()); } catch(Exception e){ e.printStackTrace(); } }; List<Thread> threads = IntStream.rangeClosed(1,5).mapToObj(i->new Thread(task)).collect(Collectors.toList()); threads.forEach(t -> t.start()); // 启动所有子线程 threads.stream().forEach(t -> {try{t.join();}catch(Throwable ex){}}); System.gc(); // 提示JVM回收垃圾 } } ``` 此程序展示了五个不同的线程各自拥有自己版本的计数,并且这些不会相互覆盖或混淆。即使两个线程几乎同时尝试读取/修改相同的逻辑位置上的数据,由于它们实际上是在各自的内存空间内工作,因此不存在冲突的可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值