标签: thread-safety

C++20 中的原子智能指针和互斥体

如果我想从多个线程写入/读取一个对象,即使我在 C++11 中使用shared_pointer,我也必须使用额外的互斥体来保证线程安全。如果我使用 C++20 中引入的atomic_shared_pointer,这仍然适用吗?

问候

c++ mutex thread-safety c++20

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

Files.copy 是 Java 中的线程安全函数吗?

我有一个函数,其目的是创建一个目录并将 csv 文件复制到该目录。同一个函数会运行多次,每次都由不同线程中的对象运行。它在对象的构造函数中被调用,但我在那里有逻辑,仅在文件尚不存在时才复制该文件(这意味着,它会检查以确保并行的其他实例之一尚未创建它)。

现在,我知道我可以简单地重新排列代码,以便在并行运行对象之前创建此目录并复制文件,但这对于我的用例来说并不理想。

我想知道,下面的代码会失败吗?也就是说,由于其中一个实例正在复制文件,而另一个实例尝试开始将同一文件复制到同一位置?

    private void prepareGroupDirectory() {
        new File(outputGroupFolderPath).mkdirs();
        String map = "/path/map.csv"
        File source = new File(map);
        
        String myFile = "/path/test_map.csv";
        File dest = new File(myFile);
        
        // copy file
        if (!dest.exists()) {
            try{
                Files.copy(source, dest);
            }catch(Exception e){
                // do nothing
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

总而言之。该函数是否是线程安全的,因为不同的线程都可以并行运行该函数而不会中断?我想是的,但任何想法都会有帮助!

需要明确的是,我已经对此进行了多次测试,并且每次都有效。我问这个问题是为了确保,从理论上讲,它仍然永远不会失败。

编辑:此外,这是高度简化的,以便我可以以易于理解的格式提出问题。

这是我在遵循评论后现在所拥有的(我仍然需要使用nio),但这目前正在工作:

   private void prepareGroupDirectory() {
        new File(outputGroupFolderPath).mkdirs();
        logger.info("created group directory");

        String map = instance.getUploadedMapPath().toString();
        File source = new File(map);
        String myFile = FilenameUtils.getBaseName(map) + …
Run Code Online (Sandbox Code Playgroud)

java multithreading asynchronous thread-safety

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

Java数组线程安全吗?

就像标题一样,给定 2 个数组int[] a,由两个线程共享,每个线程以第一个数组的每个元素都是第二个数组的对应元素int[] b的方式重新排列两个数组的元素,输出似乎总是正确的,而不需要同步需求<=a[i] <= b[i]

public class MyClass {

    int[] a = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
    int[] b = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    class MyThread extends Thread {
        public void run() {
                for (int i = 0; i < a.length; i++) {
                    if (a[i] > b[i]) {
                        int temp = b[i];
                        b[i] = a[i];
                        a[i] = …
Run Code Online (Sandbox Code Playgroud)

java multithreading synchronization thread-safety java-threads

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

Java中的时钟线程

最近在研究Java线程。我创建了这个简单的时钟,它将显示已经过去了多少秒。看起来像这样
框架

以下是上述应用程序的代码(包括 2 个类:Main 和 ClockPanel)

public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Clock");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(300, 300);
            frame.setLayout(new GridLayout(1, 1));

            ClockPanel clock = new ClockPanel();
            frame.add(clock);

            frame.setVisible(true);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)
public class ClockPanel extends JPanel implements ActionListener {

    private JLabel timeValue;
    private JButton runButton;
    private JButton pauseButton;
    private JButton resetButton;

    private boolean isRunning;
    private int seconds;


    public ClockPanel() {
        timeValue = new JLabel("0");

        setBorder(BorderFactory.createLineBorder(Color.BLACK));
        setAlignmentX(Component.CENTER_ALIGNMENT);
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

        initButtons();

        // …
Run Code Online (Sandbox Code Playgroud)

java thread-safety

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

java检测对象中没有其他线程

我正在编写一个类(Foo),当实例化时,可以从多个线程调用它.

Foo类的大多数方法可以由多个线程并行安全地调用.此类的一个方法(logout())要求完成所有其他线程.

在调用logout之前,将从线程安全集合中删除对foo的引用.因此,没有新线程会获得对Foo对象的引用.但是,可能存在正在处理对需要注销的Foo对象的引用的现有线程.

我可以有一个计数器,每次线程进入对象时递增,并在每次线程离开时递减.在logout()中,我可以旋转while(counter!= 0);

但我认为可能有一个更好的定义方式/模式来做到这一点.在这里寻找stackoverflow社区的智慧.

java multithreading design-patterns thread-safety

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

如果在修改字典时没有锁定字典会发生什么?关于asp.net缓存

对不起,我有很多关于锁/缓存的问题.= _ = ..

- > 1.关于缓存,我知道asp.net中的缓存是线程安全的,我通常使用的简单代码是

    IList<User> user= HttpRuntime.Cache["myCacheItem"] as IList<User>;
    if (user == null)
    { 
       //should i have a lock here?
       //lock(some_static_var){...}
       HttpRuntime.Cache["myCacheItem"] = GetDateFromDateBase();
    }

    return user;
Run Code Online (Sandbox Code Playgroud)

应该在代码中使用锁?

- > - > 1.1如果我使用,也许我应该申报许多锁定项目?我在社区服务器上看到了一些实现,它使用静态字典来存储锁定项,这是个好主意吗?因为我担心字典中的锁定项可能太多而且它可能会减慢系统速度.

- > - > 1.2如果我不使用,会发生什么?只是可能有两个或更多线程访问GetDateFromDateBase()?如果只是这个,我想也许我可以放弃锁定.

- > 2.i有一个存储在缓存中的通用字典,我必须修改(添加/更新/删除)它.我只是用它来获取像dic.trygetvalue(key)这样的值,不要循环它.

- > - > 2.1如果我可以保证修改只发生在一个线程中,场景就像
a.aspx - >从缓存中读取字典,并在页面上显示,public for user
b.ashx - >将修改调用它时的字典.(在5分钟内循环),私人使用

我应该在a/b中使用锁吗?锁定读者和作家?
- > - > - > 2.11如果我不使用任何锁,会发生什么?当读者和作者同时访问时,它会抛出异常吗?
- > - > - > 2.12如果我只是将作者锁定在b.ashx中,会发生什么?a.aspx中的读者会被阻止吗?什么是处理这种情况的最佳做法?

- > - > 2.2如果读写器都出现在多线程访问中.他们都是公共页面.
a.aspx …

asp.net caching dictionary locking thread-safety

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

java和线程:非常奇怪的行为

        private synchronized Map<Team, StandingRow> calculateStanding() {
          System.out.println("Calculate standing for group " + getName());
          Map<Team, StandingRow> standing = new LinkedHashMap<Team, StandingRow>();

          for (Team team : teams) {
           standing.put(team, new StandingRow(team));
          }

          StandingRow homeTeamRow, awayTeamRow;
          for (Match match : matches.values()) {

           homeTeamRow = standing.get(match.getHomeTeam());
           awayTeamRow = standing.get(match.getAwayTeam());

           System.out.println("Contains key for " + match.getHomeTeam() + ": " + standing.containsKey(match.getHomeTeam()));
           System.out.println("Contains key for " + match.getAwayTeam() + ": " + standing.containsKey(match.getAwayTeam()));
                }
        }
Run Code Online (Sandbox Code Playgroud)

这是我的代码.匹配包含6个元素,但问题是在两次匹配后,在站立地图中找不到任何键.

例如,输出

Contains key for Zuid-Afrika: true
Contains key for Mexico: …
Run Code Online (Sandbox Code Playgroud)

java thread-safety

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

如何找到特定的DLL是线程安全吗?Ant API /工具吗?

例如,我下载了Gecko 1.9.1 SDK.

它包含js3250.dll.

我怎么能确定这个DLL是线程安全的?

提前谢谢

-Parimal Das

c++ dll multithreading thread-safety

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

如果在多个线程上调用该方法,是否可以覆盖在静态方法中实例化的对象?

如果基于提供给静态方法的参数在静态方法中检索实例变量,如果不同的调用者在完全相同的时间调用静态方法,是否可以踩下实例变量?我调用的方法定义如下,我想知道实例变量发票是否可以被破坏...任何澄清将非常感谢!

public static void SendInvoiceReceipt(int invoiceId, string recipientEmailAddress)
{
    var invoice = ObjectFactory.GetInvoiceDAL().GetInvoiceByInvoiceId(invoiceId);

    var htmlBody = BuildHtmlInvoiceReceipt(invoice);
    var txtBody = BuildTextInvoiceReceipt(invoice);

    UtilitiesManager.Emails.EmailUtil.Send(SiteConfigUtilities.GetSMTPServer(),
            "referral@realtors.net", recipientEmailAddress, String.Empty,
            "Payment Receipt", htmlBody, txtBody);
}
Run Code Online (Sandbox Code Playgroud)

c# static instance-variables thread-safety

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

线程和同步

我有问题理解下面这段代码: -

public class SoCalledSigleton{

    private final static boolean allDataLoaded = SoCalledSigleton();

    private SoCalledSigleton(){

         loadDataFromDB();
         loadDataFromFile();
         loadDataAgainFromDB();

    }    
}
Run Code Online (Sandbox Code Playgroud)

这段代码线程安全吗?如果不是那么为什么?

java thread-safety

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