这可能是一个愚蠢的问题,但我是Java中的多线程编程的新手。我创建了4个线程,然后调用了它们的run方法。在run方法中,我使用了一个数组,我正在为它的索引分配值。我看到每个线程都维护着它自己的数组副本,并且没有线程不安全的行为。我只是想知道,在这种情况下,使用同步的意义是什么?(我认为它用于控制对共享资源的访问。不是阵列应该是共享数据结构吗?)关于同步的意义
关于同步的意义
回答
否 - 如果每个线程都使用自己的阵列副本,那么您有四个单独的阵列碰巧包含相同的数据,但不会发生共享。
如果您有一个数组,并且所有四个线程都在该数组上运行,至少两个线程同时使用相同数据的可能性将会共享。在这种情况下,您需要进行同步,以确保只有其中一方尝试(例如)在任何时间写入任何特定位置(或者如果某人正在读取另一个文字,则该文字是以原子方式完成的,在写之前完全读取,或者完全在写之后 - 但不允许两者重叠)。
只要你确定数组是完全不同的(在这里需要小心,因为根据你所做的事情可以有指向同一对象的指针),那么你不需要同步数组。
如果您的线程只对自己的私人数据执行操作,则不需要同步。
顺便说一句,你说你在你的线程上“调用run方法”;直接调用Thread.run()将不会在新线程中执行你的逻辑;你会想调用Thread.start()来代替(它在内部在一个单独的线程中执行run())。
是的,我的坏在那里。我调用Thread.start(),然后调用run() – simpleguy 2010-11-04 16:39:43
这取决于你的意思是“在运行方法中,我使用了一个数组”(使用压力)?如果你已经将数组的引用传递给线程,那么是的,同步将阻止同时访问数组。然而,如果你在线程中创建了一个数组实例,那么你有4个单独的数组实例,同步没有效果。
我在run方法内部创建一个数组。如果在当前上下文中不需要同步,那么让它有什么意义?我知道在run方法中编写所有功能是不好的编程风格,但主要问题是什么? – simpleguy 2010-11-04 16:38:49
在您当前的上下文中,您可以放弃同步,因为您有单独的数组副本。如果你想使用同步,你可以在一个普通的地方声明数组(主类从你产生4个线程或者把数组作为另一个类的成员变量,然后把类的实例传递给线程)。你可以用同步声明一个方法,然后在其中完成所有重量级的活动。只需调用此方法即可,因为它是同步的。只有一个线程可以在任何时间点执行它。 – prashant 2010-11-04 16:51:02
这意味着如果我创建并使用run方法中的所有数据结构,那么每个线程都会维护它自己的结构副本,并且不需要同步? – simpleguy 2010-11-04 16:56:55
- 1. 关于网络工作者同步请求的意见
- 2. 关于同步的不同方法
- 3. 关于数据库同步
- 4. 关于测试iCloud同步
- 5. TIdServer,关于再次同步
- 6. 同步意见
- 7. 关于参数块同步的含义的说明
- 8. node.js中的同步路由(关于express.js)
- 9. 需要关于Java Vector/ConcurrentModificationException的同步
- 10. 关于java同步的简单问题
- 11. 同步失败 - 关于DatabindingBuilder的错误
- 12. Github意外同步
- 13. 关于创建同步机制
- 14. 关于git-new-workdir分支同步
- 15. 关于EOF和读/写同步
- 16. 关于填充同步结构
- 17. 关于使用同步调度队列
- 18. 关于读者/作家同步
- 19. 关于同步性/异步性假设的最佳实践
- 20. 需要关于同步和异步操作的一些说明
- 21. 关键字同步和同步概念
- 22. 关于Java参考和同步关键字实践的问题?
- 23. 同步是什么意思?
- 24. 关于设计的意见合同或代码合同
- 25. Couchbase同步网关
- 26. Apache Ignite锁定用于同步网格上的任意计算
- 27. 关于WCF中的异步
- 28. 关于Glibc的意见getaddrinfo
- 29. 什么时候关闭栅格化步骤有意义?
- 30. 如何模拟同步ajax调用? (基于异步的同步)
除了不好的编程风格在运行方法中编写所有功能的缺点是什么?如果我创建并使用run方法中的所有数据结构,那么每个线程将维护它自己的结构副本,并且不需要同步。 – simpleguy 2010-11-04 16:44:17
将所有代码放在run方法中,并将其分解为多个其他函数应该不会对同步的要求(或缺乏)产生任何显着影响。 – 2010-11-04 16:56:43
性能会更快,共享数据结构或每个拥有自己数据结构的线程?另外,哪种编程风格更好还是取决于上下文?我假设每个线程维护资源的单独副本时会有内存开销? – simpleguy 2010-11-04 17:09:41