首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >同步是什么意思?

同步是什么意思?
EN

Stack Overflow用户
提问于 2009-07-06 06:47:23
回答 16查看 538.4K关注 0票数 1.1K

关于synchronized关键字的用法和意义,我有一些疑问。

  • synchronized关键字的意义是什么?
  • 什么时候方法应该是synchronized
  • 从程序和逻辑上讲,这意味着什么?
EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2009-07-06 07:01:49

synchronized关键字都是关于不同线程对相同的变量、对象和资源进行读写的。在Java中,这不是一个微不足道的话题,但以下是Sun的引语:

synchronized方法支持防止线程干扰和内存一致性错误的简单策略:如果一个对象对多个线程可见,则通过同步方法对该对象的变量进行所有读或写操作。

简单地说,当您有两个线程正在读取和写入相同的“资源”(比如一个名为foo的变量)时,您需要确保这些线程以原子方式访问变量。如果没有synchronized关键字,您的线程1可能不会看到将线程2更改为foo,或者更糟糕的是,它可能只更改了一半。这不是你逻辑上所期望的。

同样,这是Java中一个重要的主题。要了解更多信息,请浏览SO和Interweb上的主题:

继续探索这些主题,直到"Brian“这个名字永久地与你大脑中的”并发“一词联系在一起。

票数 956
EN

Stack Overflow用户

发布于 2014-05-15 13:23:03

好吧,我想我们已经有足够的理论解释了,所以考虑一下这段代码

代码语言:javascript
复制
public class SOP {
    public static void print(String s) {
        System.out.println(s+"\n");
    }
}

public class TestThread extends Thread {
    String name;
    TheDemo theDemo;
    public TestThread(String name,TheDemo theDemo) {
        this.theDemo = theDemo;
        this.name = name;
        start();
    }
    @Override
    public void run() {
        theDemo.test(name);
    }
}

public class TheDemo {
    public synchronized void test(String name) {
        for(int i=0;i<10;i++) {
            SOP.print(name + " :: "+i);
            try{
                Thread.sleep(500);
            } catch (Exception e) {
                SOP.print(e.getMessage());
            }
        }
    }
    public static void main(String[] args) {
        TheDemo theDemo = new TheDemo();
        new TestThread("THREAD 1",theDemo);
        new TestThread("THREAD 2",theDemo);
        new TestThread("THREAD 3",theDemo);
    }
}

注意:只要前一个线程的执行未完成,synchronized就会阻止下一个线程对方法test()的调用。线程可以一次访问此方法。没有synchronized,所有线程都可以同时访问此方法。

当线程调用对象的同步方法'test‘(此处对象是'TheDemo’类的一个实例)时,它获得该对象的锁时,任何新线程都不能调用同一对象的任何同步方法,只要获得锁的前一个线程不释放锁。

当调用类的任何静态同步方法时,也会发生类似的情况。线程获取与类关联的锁(在本例中,该类实例的任何非静态同步方法都可以由任何线程调用,因为该对象级别的锁仍然可用)。任何其他线程都不能调用类的任何静态同步方法,只要当前持有锁的线程不释放类级别的锁。

带有同步输出

代码语言:javascript
复制
THREAD 1 :: 0
THREAD 1 :: 1
THREAD 1 :: 2
THREAD 1 :: 3
THREAD 1 :: 4
THREAD 1 :: 5
THREAD 1 :: 6
THREAD 1 :: 7
THREAD 1 :: 8
THREAD 1 :: 9
THREAD 3 :: 0
THREAD 3 :: 1
THREAD 3 :: 2
THREAD 3 :: 3
THREAD 3 :: 4
THREAD 3 :: 5
THREAD 3 :: 6
THREAD 3 :: 7
THREAD 3 :: 8
THREAD 3 :: 9
THREAD 2 :: 0
THREAD 2 :: 1
THREAD 2 :: 2
THREAD 2 :: 3
THREAD 2 :: 4
THREAD 2 :: 5
THREAD 2 :: 6
THREAD 2 :: 7
THREAD 2 :: 8
THREAD 2 :: 9

没有同步输出

代码语言:javascript
复制
THREAD 1 :: 0
THREAD 2 :: 0
THREAD 3 :: 0
THREAD 1 :: 1
THREAD 2 :: 1
THREAD 3 :: 1
THREAD 1 :: 2
THREAD 2 :: 2
THREAD 3 :: 2
THREAD 1 :: 3
THREAD 2 :: 3
THREAD 3 :: 3
THREAD 1 :: 4
THREAD 2 :: 4
THREAD 3 :: 4
THREAD 1 :: 5
THREAD 2 :: 5
THREAD 3 :: 5
THREAD 1 :: 6
THREAD 2 :: 6
THREAD 3 :: 6
THREAD 1 :: 7
THREAD 2 :: 7
THREAD 3 :: 7
THREAD 1 :: 8
THREAD 2 :: 8
THREAD 3 :: 8
THREAD 1 :: 9
THREAD 2 :: 9
THREAD 3 :: 9
票数 327
EN

Stack Overflow用户

发布于 2011-01-22 18:39:44

synchronized关键字防止多个线程并发访问代码块或对象。Hashtable的所有方法都是synchronized,因此一次只能执行一个线程。

当使用非synchronized结构(如HashMap )时,必须在代码中构建线程安全特性,以防止一致性错误。

票数 121
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1085709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档