首页 > Java > 这是 ‘synchronized’ 什么意思?

这是 ‘synchronized’ 什么意思?

上一篇 下一篇

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

  • 关键词的意义是什么?synchronized
  • 方法应该在什么时候?synchronized
  • 它在编程和逻辑上意味着什么?

分割线

网友回答:

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

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);
    }
}

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

当线程调用对象的同步方法“test”时(此处对象是“TheDemo”类的实例),它获取该对象的锁,只要获取锁的先前线程不释放锁,任何新线程就不能调用同一对象的任何同步方法。

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

同步输出

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

输出不同步

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

分割线

网友回答:

关键字是关于不同的线程读取和写入相同的变量、对象和资源。这在Java中不是一个微不足道的话题,但这里有一句来自Sun的话:synchronized

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

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

同样,这在Java中是一个不平凡的话题。要了解更多信息,请在此处探索有关SO和互联网的主题:

  • 并发
  • Java内存模型

继续探索这些主题,直到“Brian Goetz”这个名字与大脑中的“并发”一词永久相关。

分割线

网友回答:

关键字可防止多个线程同时访问代码块或对象。的所有方法都是 ,因此一次只有一个线程可以执行其中任何一个。synchronizedHashtablesynchronized

使用非构造(如 )时,必须在代码中构建线程安全功能以防止一致性错误。synchronizedHashMap

模板简介:该模板名称为【这是 ‘synchronized’ 什么意思?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 187次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 02-27
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信图片 微信公众平台 响应式 微信模板 自适应 单页式简历模板 企业网站 微信文章 html5 微信素材
您可能会喜欢的其他模板