我在并发方面有点陌生(我相信我在Monitors,Semaphores和reentrantLocks方面做得很好),所以我不能使用它们。 我必须使用并发包中的任何类或接口。
第1点:很少有线程必须访问数组并对其元素进行求和(我在这里使用了原子变量,有一个原子变量用作数组的指针)。
点2-在这里,岸上有许多线(汽车)穿过河。有一个模拟船的线程。船上有10辆车时,它将驶向另一岸。一直重复这种安全性,直到所有汽车都过河为止。我真的不知道在这里使用哪个。
点3.-在这里,某些线程必须读取某些信息,而其他线程则必须修改该信息(任意次数)。我相信这里我必须使用ReadWriteLock。
要点4.-类似生产者/消费者的问题。在这里,我使用了BlockingQueue。
第5点:组成了类似交换器的问题并加以解决(完成,非常简单……两个线程交换一个String变量)。
如果您对在某些点上使用哪种方法有什么建议(例如“否,请在第3点使用原子变量,在第1点使用CyclerBarrier”),将对我有很大帮助!
谢谢!
答案 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的信息。 我认为这会有所帮助:
答案 1 :(得分:0)
第2点:如果线程是船,则应在河的两岸乘汽车,然后在另一岸卸下汽车。看起来银行中汽车的最自然的表示形式是船上汽车的BlockingQueue和ArrayList。通常,始终首先考虑BlockingQueue。
第3点:这通常是通过同步方法或ReentrantLocks完成的。