标签: synchronization

Java - 同步

嗨,我做了一个扩展线程的东西,添加添加一个具有IP的对象.然后我做了这个线程的两个实例并启动它们.他们使用相同的列表.

我现在想使用Synchronized来停止并发更新问题.但它没有工作,我无法解决原因.

我的主要课程:

import java.util.*;
import java.io.*;
import java.net.*;

class ListTest2 {
    public static LinkedList<Peer>  myList = new LinkedList<Peer>();

    public static void main(String [] args) {   
        try {
            AddIp test1 = new AddIp(myList);
            AddIp test2 = new AddIp(myList);

            test1.start();
            test2.start();      
        } catch(Exception e) {
            System.out.println("not working");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的线程类:

 class AddIp extends Thread {
     public static int startIp = 0;

     List<Peer> myList;

     public  AddIp(List<Peer> l) {
         myList = l;
     }


     public synchronized void run() {      
        try {
            startIp = …
Run Code Online (Sandbox Code Playgroud)

java multithreading synchronization

0
推荐指数
1
解决办法
136
查看次数

是否有必要同步最终成员?

我有一个在不同线程中使用的数据库对象:

import java.sql.Connection;
import oracle.ucp.jdbc.PoolDataSourceFactory;
import oracle.ucp.jdbc.PoolDataSource;

public class Database
{
  private final PoolDataSource pool = PoolDataSourceFactory.getPoolDataSource();

  protected Connection connect ()
  {
    synchronized (pool) { return pool.getConnection(); }
  }

  protected void disconnect (Connection connection)
  {
    synchronized (pool) { connection.close(); }
  }
}
Run Code Online (Sandbox Code Playgroud)

是否有必要同步对pool成员的访问?或者是否足以避免显式同步?

如果需要同步,则代码将被破坏,因为没有必要调用disconnect以关闭连接.类中的某些代码可以connection.close()绕过同步调用.

java multithreading synchronization

0
推荐指数
1
解决办法
208
查看次数

Java同步:如果java中的多个方法是原子/同步的,那么锁是否同时应用于所有这些方法?

假设我的java代码中有2个同步方法:

    public class SynchronizedCounter {
    private int c = 0;

    public synchronized void increment() {
        c++;
    }

    public synchronized void decrement() {
        c--;
    }

    public synchronized int value() {
        return c;
    }
}
Run Code Online (Sandbox Code Playgroud)

假设我有2个操作线程:t1和t2.如果t1在increment()方法上运行并在中途进入休眠状态,则由于锁定,t2将无法在increment()方法上运行.我的问题是t2能够对decrement()和value()进行操作,或者一旦线程访问其中一个同步方法,与对象关联的所有同步方法都会被锁定吗?

静态同步方法怎么样?

java multithreading synchronization

0
推荐指数
1
解决办法
1327
查看次数

阻止行为 - 并发数据结构Java

我目前正在运行一个高度并发的基准测试,它ConcurrentSkipList从Java集合中访问一个.我发现线程在该方法中被阻塞,更准确地说:

java.util.concurrent.ConcurrentSkipListMap.doGet(ConcurrentSkipListMap.java:828)    
java.util.concurrent.ConcurrentSkipListMap.get(ConcurrentSkipListMap.java:1626)
Run Code Online (Sandbox Code Playgroud)

(这是通过超过10秒的间隔打印每个单独线程的堆栈跟踪获得的).几分钟后仍未解决

这是集合的预期行为吗?什么是可能遇到阻塞的并发其他集合?

经过测试,我表现出与ConcurrentHashMaps 相似的行为:

java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:994)
Run Code Online (Sandbox Code Playgroud)

java collections concurrency multithreading synchronization

0
推荐指数
1
解决办法
515
查看次数

Waitforsingleobject for event不起作用

主线程:

(是的,我现在停止主线程,我现在真的需要它进行测试,这是测试单元.我将在最后阶段在另一个线程中完成所有这些工作.)

码:

function TFreHolder.GetVersion: TFreHolderVersion;
Var
 Data   : TBArray;
 StrLen : Integer;
begin
 SetLength(Data, 0);

 FFrePro.SendCommand(PROTO_COMVERSION, Data);

 ResetEvent(FAsyncMutex);

 if (WaitForSingleObject(FAsyncMutex, PROTO_COMMANDTIMEOUT) = WAIT_TIMEOUT) Then
  Begin
   ShowMessage('Timeout');
   ResetEvent(FAsyncMutex);
   Exit;
  End;

Result.DType    := BytesToWord(FActivePackage.User.Parameters, 0);
Result.DVersion := BytesToWord(FActivePackage.User.Parameters, 2);
StrLen          := BytesToByte(FActivePackage.User.Parameters, 4);

if StrLen < 32
  then Result.DDesc    := BytesToString(FActivePackage.User.Parameters, 5)
  else Result.DDesc    := BytesToString(FActivePackage.User.Parameters, 4);
Run Code Online (Sandbox Code Playgroud)

在COM端口监视线程中:

procedure TFreHolder.CommandSwitcher(Package: TFreProPackage);
...
Begin
     FActivePackage := Package;
     SetEvent(FAsyncMutex)
End;
...
Run Code Online (Sandbox Code Playgroud)

我总是看到超时消息,但如果我评论Waitforsingleobject我可以看到字节和包来了.

我用这种方式在Constructor中创建了Event:

FAsyncMutex  := CreateEvent(Nil, True, False, 'FRE_EVENT');
Run Code Online (Sandbox Code Playgroud)

我的错是什么?在获取结果之前,我需要等待CommandSwitcher函数的调用.

谢谢.

delphi winapi synchronization

0
推荐指数
1
解决办法
1398
查看次数

SymmetricDS中postgresql的批量初始加载

我试图用symmetricds配置mysqlpostgres与变革同步.我在初始负载时具有非常低的插入性能,100%CPU负载postgres.当我查看postgres日志时,我发现它已经使用了INSERT.它可以正常工作,但不能用于初始化,因为我有数百万条记录.我建立PostgresBulkDatabaseWriter了源代码,它使用COPY而不是INSERT它看起来像一个很好的解决方案(COPYsql请求对我很好),但我没有找到我如何使用它.

所以我的问题:

如何更好地symmetricds为数百万条记录进行初始加载?

如何启用PostgresBulkDatabaseWriter初始(反向初始)加载?

谢谢

UPD:

来源表mysql:

CREATE TABLE `companies` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cid` int(11) NOT NULL,
  `universalName` text NOT NULL,
  `name` text NOT NULL,
  `country` text NOT NULL,
  `city` text NOT NULL,
  `street` text NOT NULL,
  `phone` text NOT NULL,
  `foundedYear` text NOT NULL,
  `employeeCountRange` text NOT NULL,
  `specialties` …
Run Code Online (Sandbox Code Playgroud)

postgresql synchronization symmetricds

0
推荐指数
1
解决办法
1641
查看次数

执行外部命令时阻止Powershell

当您调用外部.exe命令时,如何使PowerShell阻塞直到外部结束?

powershell synchronization block

0
推荐指数
1
解决办法
102
查看次数

线程如何知道如何"返回"先前锁定的块?

考虑以下代码:(注意:为了代码清晰,删除了所有try/catch)

Object lock1 = new Object();
Object lock2 = new Object();
List<Integer> list1 = new ArrayList<Integer>();
List<Integer> list2 = new ArrayList<Integer>();

public void process() {
    for (int i = 0; i < 1000; i++) {
        methodA();
        methodB();
    }
}

public void methodA() {

    synchronized (lock1) {
        Thread.sleep(1); // mimics other operations
        list1.add(random.nextInt(100));
    }
}

public void methodB() {

    synchronized (lock2) {
        Thread.sleep(1); // mimics other operations
        list2.add(random.nextInt(100));
    }
}
Run Code Online (Sandbox Code Playgroud)

现在假设创建了2个线程,并且两个线程都只是调用process()它们的方法run().

假设当thread2尝试访问时,thread1 methodA()已经锁定了.根据我的理解,thread2将跳过同步锁定,退出methodA()和启动methodB …

java multithreading synchronization

0
推荐指数
1
解决办法
46
查看次数

为什么我的代码在没有使用同步的情况下完美运行..?

我在操作系统中遇到了与我的代码行为混淆的问题.现在你们都有很多方法可以为多线程进行同步,以便无论如何都能获得正确的值!

为什么我总是得到正确的价值而不使用同步的方式??? !

例如,查看下面的代码

在常规行为中,下面的程序应该在几秒后终止..因为有十个线程访问同一个变量并将其递增一个......并且在某些情况下应该导致计数值不是100000 ...这将停止循环..我在20分钟内运行此代码..它完美地工作..

任何人都可以告诉我发生了什么:D ??

我的操作系统是Windows 7,我正在使用eclipse Kepler .. JVM是8 ..而我的CPU不是双核......它是一个常规的独奏......有2.4 GHZ ......

public class Worker {
    int count;

    public static void main(String[] args) {
        new Worker().run();
    }

    public void run() {
        do {
            count = 0;
            Thread thread1 = new Thread(new Runnable() {
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        count++;
                    }
                }
            });

            Thread thread2 = new Thread(new Runnable() {
                public void run() {
                    for (int i = …
Run Code Online (Sandbox Code Playgroud)

java windows cpu multithreading synchronization

0
推荐指数
1
解决办法
169
查看次数

从不同的线程同步请求JavaFX线程内的数据

我有一个单独的线程需要请求一些可能在此期间在JavaFX线程内发生变化的数据.我想在这个单独的线程中执行一个阻塞调用,以确保请求被引入JavaFX线程.

Swing-GUI测试框架AssertJ为此提供了一个易于使用的API:

List list = GuiActionRunner.execute(new GuiQuery<...>...);
Run Code Online (Sandbox Code Playgroud)

调用阻塞当前线程,在事件调度线程中执行传递的代码并返回所需的数据.

如何在JavaFX应用程序的生产代码中实现?这个要求的推荐方法是什么?

multithreading synchronization javafx

0
推荐指数
1
解决办法
817
查看次数