关于并发JAVA的建议

时间:2018-11-13 23:23:12

标签: java multithreading concurrency

我在并发方面有点陌生(我相信我在Monitors,Semaphores和reentrantLocks方面做得很好),所以我不能使用它们。 我必须使用并发包中的任何类或接口。

第1点:很少有线程必须访问数组并对其元素进行求和(我在这里使用了原子变量,有一个原子变量用作数组的指针)。

点2-在这里,岸上有许多线(汽车)穿过河。有一个模拟船的线程。船上有10辆车时,它将驶向另一岸。一直重复这种安全性,直到所有汽车都过河为止。我真的不知道在这里使用哪个。

点3.-在这里,某些线程必须读取某些信息,而其他线程则必须修改该信息(任意次数)。我相信这里我必须使用ReadWriteLock。

要点4.-类似生产者/消费者的问题。在这里,我使用了BlockingQueue。

第5点:组成了类似交换器的问题并加以解决(完成,非常简单……两个线程交换一个String变量)。

如果您对在某些点上使用哪种方法有什么建议(例如“否,请在第3点使用原子变量,在第1点使用CyclerBarrier”),将对我有很大帮助!

谢谢!

2 个答案:

答案 0 :(得分:0)

原子变量

原子变量采用CAS算法进行处理,可以安全地由多个线程使用:

CAS:

典型的CAS运算对三个操作数起作用: 要在其上操作的内存位置(M)现有预期 变量的值(A)需要设置的新值(B) CAS操作原子地将M中的值更新为B,但前提是 M中的现有值与A匹配,否则不采取任何措施。

您可以使用Exchanger来进行交换,交换一些    两个线程之间的信息

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Exchanger.html

阻塞队列是您提到的消费者生产者模型,因此对于 使用它,您需要创建两个线程,一个将是Producer,它将 放入“阻塞”队列后,使用者将对其进行消费(读取)。 有很多BlockingQueue的实现
还有更多    详细信息:

http://tutorials.jenkov.com/java-util-concurrent/blockingqueue.html

所以从您的清单中可以看到他们的全部位置。

此外,您还可以在此处了解有关java.util.concurrent的信息。 我认为这会有所帮助:

http://tutorials.jenkov.com/java-util-concurrent/index.html

答案 1 :(得分:0)

第2点:如果线程是船,则应在河的两岸乘汽车,然后在另一岸卸下汽车。看起来银行中汽车的最自然的表示形式是船上汽车的BlockingQueue和ArrayList。通常,始终首先考虑BlockingQueue。

第3点:这通常是通过同步方法或ReentrantLocks完成的。