当前位置: 首页 > 面试题库 >

为什么同步无法正常工作?

岳嘉容
2023-03-14
问题内容

这是我的代码:

private int count = 0;

  public synchronized void increment() {
      count++;
  }

 public void doWork() throws InterruptedException {

    Thread t1 = new Thread(new Runnable() {
        public void run() {
            for (int i = 0; i < 5; i++) {
                increment();
                System.out.println(count+"  "+Thread.currentThread().getName());
            }}});

    Thread t2 = new Thread(new Runnable() {
        public void run() {
            for (int i = 0; i < 5; i++) {
                increment();
                System.out.println(count+"  "+Thread.currentThread().getName());
            }}});

    t1.start();
    t2.start();
}

这是我的输出:

2  Thread-1
2  Thread-0
3  Thread-1
5  Thread-1
6  Thread-1
4  Thread-0
8  Thread-0
9  Thread-0
7  Thread-1
10  Thread-0

我的理解increment
synchronized。因此,应该首先increment一个号码,然后松开lock,然后给lock到线t1t2。所以,一次应该有increment一个数字,对吧?

但是为什么我的代码一次是incrementing两个或三个数字?我做错什么了吗(我是新手)?


问题答案:

虽然count++;确实不是同步System.out.println(count+" "+Thread.currentThread().getName());的,但是它访问count变量。

即使您同步访问权限,它也无济于事,因为下一种情况仍然可能:

  • 线程1增量
  • 线程2增量
  • 线程1的打印值 2
  • 线程2的打印值 2

要解决此问题,您需要增加并在同一同步部分中打印。例如你可以把System.out.println(count+" "+Thread.currentThread().getName());进入increment的方法。



 类似资料:
  • 问题内容: 看来AngularJS的不起作用。它不适用于数字字符串。难道我做错了什么?我应该使用吗? 我需要一些东西来查看字符串是否是一个数字(实际上是一个数字),除非我乘以1,否则我不会这么做,但是如果我这样做,那么它将始终为真。另外是不是一个数字(定义)等应该返回false。 问题答案: 在 JavaScript中 ,。 例如,如果需要将 字符串 识别为 Number ,则将其转换为 Numb

  • 问题内容: 我试图通过使用该方法销毁所有会话变量,但是在使用此方法之后,这些值不会被销毁。 为什么不工作? 还有其他方法可以销毁PHP中的会话吗? 问题答案: 使用后,会话将在后台被销毁。由于某种原因,这不会影响已为此请求填充的中的值,但在以后的请求中将为空。 如果需要,您可以手动清除()。

  • 问题内容: 为什么这不起作用? 实际上,我所有的元素都不可见。如果我在选择器中删除对的引用,则确实会显示div中的最后一个,但这不是我想要的。 当然,我只能一直保留一个,但这只是一个reveal.js演示文稿,我无法控制JavaScript。 如何选择带有类的div中的最后一个元素?我不想为此使用JavaScript。 问题答案: 您的问题是,您正在阅读并认为它可以用作选择器,而实际上它 仅 表示

  • 问题内容: 我在Ubuntu Hardy VPS上做了一份计划工作,只有一半可以工作,我不知道为什么。这项工作是一个Ruby脚本,它使用mysqldump备份Rails应用程序使用的MySQL数据库,然后将其压缩并使用SFTP上传到远程服务器。 gzip文件已成功创建并复制,但始终为零字节。但是,如果我直接从命令行运行cron命令,它将运行完美。 这是cron工作: 这是datadump.rb:

  • 问题内容: 我试图在sed的正则表达式中使用它,但是它不起作用: 但这是可行的: 问题答案: 是一个开关,而不是正则表达式宏。如果要使用一些预定义的“常量”而不是表达式,请尝试运行以下代码:

  • 问题内容: 谁能解释两个我为什么这些代码不输出相同的结果(两个代码之间的唯一区别是run()方法)? 注意:第一个代码似乎没有做任何锁定! 第一个代码: 第二个代码: 该代码完全按照预期工作 问题答案: 第一码 事实是,您有3个线程实例,每个线程运行它自己的method实例。但是总是只有一个线程想要与其自己的方法同步,因此它将在线程希望其运行时运行。这根本没有同步。 第二码 您也有3个线程实例,但