如果我想从多个线程写入/读取一个对象,即使我在 C++11 中使用shared_pointer,我也必须使用额外的互斥体来保证线程安全。如果我使用 C++20 中引入的atomic_shared_pointer,这仍然适用吗?
问候
我有一个函数,其目的是创建一个目录并将 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) 就像标题一样,给定 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
最近在研究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) 我正在编写一个类(Foo),当实例化时,可以从多个线程调用它.
Foo类的大多数方法可以由多个线程并行安全地调用.此类的一个方法(logout())要求完成所有其他线程.
在调用logout之前,将从线程安全集合中删除对foo的引用.因此,没有新线程会获得对Foo对象的引用.但是,可能存在正在处理对需要注销的Foo对象的引用的现有线程.
我可以有一个计数器,每次线程进入对象时递增,并在每次线程离开时递减.在logout()中,我可以旋转while(counter!= 0);
但我认为可能有一个更好的定义方式/模式来做到这一点.在这里寻找stackoverflow社区的智慧.
对不起,我有很多关于锁/缓存的问题.= _ = ..
- > 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 …
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) 如果基于提供给静态方法的参数在静态方法中检索实例变量,如果不同的调用者在完全相同的时间调用静态方法,是否可以踩下实例变量?我调用的方法定义如下,我想知道实例变量发票是否可以被破坏...任何澄清将非常感谢!
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) 我有问题理解下面这段代码: -
public class SoCalledSigleton{
private final static boolean allDataLoaded = SoCalledSigleton();
private SoCalledSigleton(){
loadDataFromDB();
loadDataFromFile();
loadDataAgainFromDB();
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码线程安全吗?如果不是那么为什么?
thread-safety ×10
java ×6
c++ ×2
asp.net ×1
asynchronous ×1
c# ×1
c++20 ×1
caching ×1
dictionary ×1
dll ×1
java-threads ×1
locking ×1
mutex ×1
static ×1