Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
同步语句java——相对于非同步代码,它们到底做了什么?_Java_Concurrency_Synchronization - Fatal编程技术网

同步语句java——相对于非同步代码,它们到底做了什么?

同步语句java——相对于非同步代码,它们到底做了什么?,java,concurrency,synchronization,Java,Concurrency,Synchronization,java中的synchronized语句是否可以防止在没有synchronized语句的情况下访问线程的其他线程中修改同步对象?我是多线程编程新手,对我在这个问题上找到的文档感到困惑 假设我有以下代码 public class Test { public ArrayList<Integer> items = new ArrayList<Integer>(); public Test(ArrayList<Integer> items) { this.i

java中的synchronized语句是否可以防止在没有synchronized语句的情况下访问线程的其他线程中修改同步对象?我是多线程编程新手,对我在这个问题上找到的文档感到困惑

假设我有以下代码

public class Test {
public ArrayList<Integer> items = new ArrayList<Integer>();

public Test(ArrayList<Integer> items) {
    this.items = items; 
}

public void perform() {
    synchronized(items) {
        int size = items.size();
        for(int n = 0; n < 10000; n++) {
              for(int i = 0; i < size; i ++) {
                  items.set(i, items.get(i) + 1);
              }
        }
    }
}
公共类测试{
public ArrayList items=new ArrayList();
公共测试(ArrayList项目){
这个项目=项目;
}
公开执行{
已同步(项目){
int size=items.size();
对于(int n=0;n<10000;n++){
对于(int i=0;i
当“perform”中的内部循环运行时,尽管整个循环包含在“synchronized(items)”语句中,“synchronized”语句是否可以防止使用“synchronized(items)”的其他块修改“items”他们自己要求锁定“项目”


提前感谢您的帮助。

在同步块之外执行修改您的项的代码的线程可以自由修改这些项,即使其他线程正在执行同步代码。您必须小心在任何地方同步(没有编译器或运行时系统的帮助)。这是使编写多线程代码变得困难的一个方面。

在同步块之外执行修改项目的代码的线程可以自由修改项目,即使另一个线程正在执行同步代码。您必须小心在任何地方同步(无需编译器或运行时系统的帮助)。这是使编写多线程代码变得困难的一个方面。

在对象上同步并不意味着没有其他线程可以修改它。这意味着也在该对象上同步的其他线程必须等待释放锁

或者“synchronized”语句是否仅防止使用“synchronized(items)”本身请求锁定“items”的其他块进行修改


因此,此语句是正确的。

在对象上同步并不意味着没有其他线程可以修改它。这意味着也在该对象上同步的其他线程必须等待您的锁释放

或者“synchronized”语句是否仅防止使用“synchronized(items)”本身请求锁定“items”的其他块进行修改


因此,此语句是正确的。

synchronized语句表示它执行一些“非线程安全”代码(或“关键区域”),并阻止尝试运行同步语句(即非线程安全代码)的其他线程,直到它完成

但其他不执行关键区域的线程将不会被阻塞

而synchronized语句使用“mutex”。mutex表示一个对象,关键区域修改哪个对象。(synchronized声明中的哪个对象)

就你的情况而言,它是

items

其他使用不同互斥锁的线程(不使用“项”)也不会被阻止

下面可能会帮助您:
synchronized语句表示它执行一些“非线程安全”代码(或“关键区域”),并阻止尝试运行同步语句(即非线程安全代码)的其他线程,直到它完成

但其他不执行关键区域的线程将不会被阻塞

而synchronized语句使用“mutex”。mutex表示一个对象,关键区域修改哪个对象。(synchronized声明中的哪个对象)

就你的情况而言,它是

items

其他使用不同互斥锁的线程(不使用“项”)也不会被阻止

下面可能会帮助您:

除了问题标题的Rob答案和寻址字面意义外:
synchronized
Java代码块介绍了执行
synchronized
代码块的线程之间的同步顺序关系。查找JLS以了解它对您的代码是否有帮助。除了Rob答案和寻址问题的字面意义外n的标题:
synchronized
Java代码块介绍了执行
synchronized
代码块的线程之间的同步顺序关系。查看JLS以了解它如何/是否有助于您的代码。同步不仅仅是锁定,它还为本地线程更改中央存储和更新本地存储提供了内存障碍来自中央@vancan1ty@Gray的torage您能提供一个链接来讨论您刚才提到的内容吗?(记忆障碍)@Gray提出了一个很好的观点——同步也带来了一种“之前发生”的关系。请看我的回答:这是关于这个主题的另一个很好的链接:同步不仅仅是锁定,它还提供了一个内存屏障,用于对中央存储的本地线程更改以及从中央@vancan1ty更新本地存储。@Gray您能提供一个ink讨论了你刚才提到的内容?(记忆障碍)。@Gray提出了一个很好的观点——同步也带来了一种“之前发生”的关系。请看我的回答:这是关于这个主题的另一个很好的链接: