相关疑难解决方法(0)

为什么i ++不是原子的?

为什么i++Java中没有原子?

为了更深入地了解Java,我试图计算线程循环执行的频率.

所以我用了一个

private static int total = 0;
Run Code Online (Sandbox Code Playgroud)

在主要班级.

我有两个主题.

  • 线程1:打印 System.out.println("Hello from Thread 1!");
  • 线程2:打印 System.out.println("Hello from Thread 2!");

并且我计算由线程1和线程2打印的线.但是线程1的线+线程2的线与打印出的总线数不匹配.

这是我的代码:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Test {

    private static int total = 0;
    private static int countT1 = 0;
    private static int countT2 = 0;
    private boolean run = true;

    public Test() {
        ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
        newCachedThreadPool.execute(t1);
        newCachedThreadPool.execute(t2);
        try {
            Thread.sleep(1000);
        }
        catch (InterruptedException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); …
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading

94
推荐指数
5
解决办法
2万
查看次数

Java 8中的reduce累加器是否允许修改其参数?

在Java 8中,Stream有一个方法减少:

T reduce(T identity, BinaryOperator<T> accumulator);
Run Code Online (Sandbox Code Playgroud)

累加器运算符是否允许修改其任一参数?我认为不是因为JavaDoc说累加器应该是NonInterfering,尽管所有的例子都谈到修改集合,而不是修改集合的元素.

所以,举一个具体的例子,如果我们有

 integers.reduce(0, Integer::sum);
Run Code Online (Sandbox Code Playgroud)

并假设一个Integer可变的时刻,sum可以通过向其添加(就地)第二个参数的值来修改其第一个参数吗?

我认为不是,但我也想要一个这个干扰导致问题的例子.

java reduce accumulator java-8 java-stream

16
推荐指数
1
解决办法
4363
查看次数

java 8:LongAdder和LongAccumulator是AtomicLong的首选吗?

LongAdder 作为替代 AtomicLong

ExecutorService executor = Executors.newFixedThreadPool(2);    
IntStream.range(0, 1000)
    .forEach(i -> executor.submit(adder::increment));    
stop(executor);    
System.out.println(adder.sumThenReset());   // => 1000
Run Code Online (Sandbox Code Playgroud)

LongAccumulator 是一个更通用的版本 LongAdder

LongBinaryOperator op = (x, y) -> 2 * x + y;
LongAccumulator accumulator = new LongAccumulator(op, 1L);

ExecutorService executor = Executors.newFixedThreadPool(2);
IntStream.range(0, 10)
    .forEach(i -> executor.submit(() -> accumulator.accumulate(i)));
stop(executor);

System.out.println(accumulator.getThenReset());     // => 2539
Run Code Online (Sandbox Code Playgroud)

我有一些疑问.

  1. LongAdder总是喜欢AtomicLong的?
  2. 是否LongAccumulator优先选择LongAdder和AtomicLong?

java concurrency java-8

4
推荐指数
1
解决办法
2424
查看次数

Java 8 Stream将元素添加到列表和求和

我相信我可以在listOfPricedObjects上使用一个流操作来做下一步:

List<BigDecimal> myList = new ArrayList();
myList = listOfPricedObjects.stream().map(PricedObject::getPrice).collect(Collectors.toList());
BigDecimal sum = listOfPricedObjects.stream().map(PricedObject::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add)
Run Code Online (Sandbox Code Playgroud)

我如何用价格填充myList并使用流一次计算价格总和?谢谢

UPD:结果我需要myList填充价格和sum变量和sum.但不是两次使用stream().

java collections sum java-8 java-stream

4
推荐指数
2
解决办法
7069
查看次数