jjzjj

Synchronized

全部标签

java - 在 Java 中同步对象

我正在寻找类似于此语法的东西,即使它不存在。我想让一个方法作用于一个集合,并且在该方法的生命周期内,确保集合没有被弄乱。所以它看起来像:privatevoidsynchronized(collectionX)doSomethingWithCollectionX(){//dosomethingwithcollectionxhere,methodacquiresandreleaseslockon//collectionXautomaticallybeforeandafterthemethodiscalled}但是,恐怕唯一的方法是:privatevoiddoSomethingWithThe

java - 如何在多线程中使用等待和通知协议(protocol)

具体来说,有人能告诉我这段代码有什么问题吗?它应该启动线程,所以应该打印“Enteringthread..”5次,然后等待直到调用notifyAll()。但是,它随机打印“Entering..”和“Done..”并继续等待其他人。publicclassThreadTestimplementsRunnable{privateintnum;privatestaticObjectobj=newObject();ThreadTest(intn){num=n;}@Overridepublicvoidrun(){synchronized(obj){try{System.out.println("E

java - 使数据结构线程安全的最有效方法(Java)

我有一个需要线程安全的共享map数据结构。同步是读取或添加到map的最有效方式吗?谢谢!编辑:数据结构是一个不可更新的缓存,即一旦填满它就不会更新缓存。因此,最初有很多写入和一些读取,然后主要是读取 最佳答案 “最有效率”当然是相对的,要看你的具体情况。但是考虑像ConcurrentHashMap这样的东西如果您希望有多个线程同时处理map;它是线程安全的,但仍然允许并发访问,这与Hashtable或Collections.synchronizedMap()不同。 关于java-使数据结

java - IllegalMonitorStateException notify() 和 wait()

这个问题在这里已经有了答案:JavaWaitandNotify:IllegalMonitorStateException(2个答案)关闭5年前。我有一个问题。当我在同步块(synchronizedblock)中使用notify()时,我得到IllegalMonitorStateException。谁能帮我解决这个问题?我需要一个线程向第二个线程发送一个字符,然后这个线程必须等待,第二个线程打印这个字符。在第二个线程等待之后,第一个线程再次发送下一个字符主要.java:importjava.util.logging.Level;importjava.util.logging.Logger

c# - C# 中的同步方法

将Java应用程序移植到C#的一部分是在C#中实现同步消息缓冲区。同步的意思是线程在其中写入和读取消息应该是安全的。在Java中,这可以使用synchronized方法以及wait()和notifyAll()来解决。例子:publicclassMessageBuffer{//SharedresourcesupherepublicMessageBuffer(){//Initiatingthesharedresources}publicsynchronizedvoidpost(Objectobj){//Dostuffwait();//DomorestuffnotifyAll();//Doe

java - 如何克隆同步集合?

想象一个同步集合:Sets=Collections.synchronizedSet(newHashSet())克隆此集合的最佳方法是什么?最好克隆不需要对原始集合进行任何同步,但要求对克隆集合进行迭代不需要对原始集合进行任何同步。 最佳答案 在同步块(synchronizedblock)中使用复制构造函数:synchronized(s){SetnewSet=newHashSet(s);//preferablyusegenerics}如果您还需要同步副本,请再次使用Collections.synchronizedSet(..)。根据P

java - 如何在没有同步方法的情况下从不同的线程安全地刷新缓冲区?

有多个线程,比如B、C和D,每个线程都以高频率将小数据包写入缓冲区。他们拥有自己的缓冲区,没有其他人可以写入它。写作必须尽可能快,我已经确定使用synchronized会使它慢得令人无法接受。缓冲区只是字节数组,以及第一个空闲元素的索引:byte[]buffer;intindex;publicvoidwrite(byte[]data){//somecheckingthatthebufferwon'toverflow...notimportantnowSystem.arraycopy(data,0,buffer,index,data.length);index+=data.length;

java - 列表上同步的这两种用法在行为上有什么区别

Listlist=newArrayList();list.add("a");...list.add("z");synchronized(list){Iteratori=list.iterator();while(i.hasNext()){...}}和Listlist=newArrayList();list.add("a");...list.add("z");ListsynchronizedList=Collections.synchronizedList(list);synchronized(synchronizedList){Iteratori=synchronizedList.it

java - 显式锁与隐式锁

正在使用锁(java.util.concurrent.locks.Lock)而不是关键字synchronized+方法wait()和方法notify()完全一样吗?我可以使用锁(显式锁)而不是隐式锁(synchronized)进行线程安全编程吗?据我所知,我一直在使用隐式锁。我知道Lock接口(interface)实现的优点,例如方法:isLocked()、getLockQueueLength()、getHoldCount()等等...然而,除了没有这些方法之外,仍然是老派方式(wait()和notify())会有其他限制吗?我也知道使用(boolean公平性)参数构造一个锁的可能性,

java - Java 编译器是否优化了空的同步块(synchronized block)?

假设我在代码的某处写了一个空的synchronizedblock:synchronized(obj){//Nocodehere}因此,由于同步块(synchronizedblock)不包含任何代码,JIT编译器是否会通过不锁定obj来优化它,因为它没有用?Java编译器会做一些类似的技巧,例如Lockcoarsening,但是这个同步块(synchronizedblock)是否也会被优化掉?编辑:根据assylias的观点,synchronized(newObject()){//emptyblock}JIT编译器现在是否能够优化它,因为我使用的对象不会转义我的方法?