Java 同步 String IllegalMonitorStateException

2024-01-05

我试图让 Thread2 等待 String 并让 Thread1 通知 String 更新,我确实同步了 String 对象,如下面的代码所示,但我仍然得到IllegalMonitorStateException这是我的代码

public class Class1{

String string   = "";

public Class1(){


    Thread t1   = new Thread(){

        public void run(){

            synchronized(string){

                string = "Something"; string.notifyAll();   //This is the line that throws an IllegalMonitorStateException
            }

        }

    };


    Thread t2   = new Thread(){

        public void run(){

            synchronized(string){

                try{

                    string.wait();

                }catch(Exception e){

                    e.printStackTrace();

                }

            }

        }

    };

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

}

StackTrace 中除了突出显示之外没有任何内容string.notifyAll()


  1. 您的代码包含数据争用,因为它访问可变的stringa 之外的变量synchronized堵塞。具体来说,这发生在线路上synchronized(string)。取消引用时string要到达监视器将被锁定的对象,线程尚未持有该对象的锁。因此,您无法保证它将获得哪个对象的锁。

  2. 事实是你mutate the string变量意味着它现在指向某个其他对象。当下一个线程获取该新对象的锁时,它将不会从任何对象中受益发生在之前关系,因为它是第一个获取其锁的线程。互斥也无法保证,因为可能有任意多个线程,每个线程锁定不同的线程String无争用的实例。

  3. 结合上面描述的两种现象我们也可以看出,并不能保证对象在线上到达synchronized(string)将与从 到达的 相同within同步块。一旦碰巧这确实是一个不同的对象,你的IllegalMonitorStateException ensues.

总结一下,情况与synchronized块根本不存在。

如果您坚持使用专用的最佳实践,则可以避免上述所有问题final变量来引用用于锁定的对象。简而言之,并修复示例中的编译错误,这就是您必须编写的内容:

static String string = "";
static final Object lock = new Object();

public static void main(String[] args) {
  Thread t1 = new Thread() {
    public void run() {
      synchronized (lock) {
        ... update the string variable ...
        lock.notifyAll();
      }
    }
  };
  Thread t2 = new Thread() {
    public void run() {
      synchronized (lock) {
        try {
          lock.wait();
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
  };
  t2.start();
  t1.start();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 同步 String IllegalMonitorStateException 的相关文章

随机推荐

  • 在索引页面上设置 PHP 会话以进行 XSRF 检查

    我遇到了以下有关 XSRF 令牌的问题 客户端 AngularJS 服务器 PHP 当index php被点击时 PHP生成一个XSRF令牌并将其保存在会话中 cookie 设置为相同的值 AngularJS 读取 cookie 并存储值
  • 如何创建带有图像和文本的按钮

    Friends 我想在 android 中显示一个按钮 如屏幕截图中提到的 谁能指导我如何实现这一目标 使用普通按钮drawableLeft属性 看我的示例代码
  • EmberJS pre2 将车把模板放在错误的位置

    我尝试在我的网络应用程序上将 EmberJS 从 pre1 更新到 pre2 但我注意到它将所有车把模板作为最后一个主体元素 有时根本不这样做 I ve 创建一个重现 http emberjs pre2 bug staticloud com
  • 有什么办法可以等到 DirectionsService 返回结果吗?

    我在使用 Google DirectionsService 时遇到问题 我知道它是异步的 这就是我遇到麻烦的原因 我想等到 DirectionsService 返回结果 而不是在没有答案的情况下执行代码 这是一个示例 function sn
  • 如何在集成测试中传递授权令牌标头?

    A 相关问题 https stackoverflow com questions 12041091 ror testing an action that uses http token authentication意味着我可以使用令牌身份验
  • Linux进程间通信如何选择“Key”?

    再会 我正在做作业 其中指出我有 5 个进程 一个服务器 其余的都是客户端 每个进程都应该由不同的可执行文件引发 我将实现一个双向消息传递解决方案 但问题不在于消息传递本身 有没有一种优雅的方式来传达key这些不同的可执行文件之间 即当我调
  • 递增指针 (ptr++) 和 (*ptr++)

    当我有这个疑问时 我正在重新审视指针 int ptr int arr 5 10 20 30 40 50 ptr arr 0 Now printf Value d ptr 会打印10 if I do ptr printf Value d pt
  • 我如何告诉 R 正确舍入?

    我如何告诉 R 正确舍入 R 中的小数位数 我遇到了一个不知道如何解决的问题 我希望 R 计算 5 26 100 19 230769 x lt 5 26 100 x 给我 1 19 23077 让我们尝试使用 round 首先将数字设置为
  • 通过 pyCurl 上传文件

    我正在尝试将以下curl代码转换为pycurl 我不想使用请求 我需要使用 pycurl 因为 requests 在我的旧 python 版本中不能完全工作 curl X POST H Accept Language en F email
  • 如何将 amazon S3 存储桶策略设置为除管理员之外的所有人私有?

    我有一个存储桶 我不小心将数千个带有 ACL 的文件上传到 public read 我希望除生成的访问 URL 之外的所有文件均不可用 我尝试创建一个存储桶策略 拒绝所有人的所有操作 并允许我的所有操作 它不起作用 即使生成了访问 URL
  • 将 DataTable 转换为 XML 文件,反之亦然

    我在将 XML 文件读取到DataTable 最初 我正在写一个Datatable到 XML 文件并保存 现在 当我想将 XML 文件读回到DataTable 它没有发生 以下代码用于写入文件 private void saveAsTool
  • Elastic Search:具有自定义类型的一个索引来区分文档模式 VS 多个索引,每个文档类型一个索引?

    我在 ES 方面没有经验 我的背景更多是关系数据库 我试图实现在我的 Web 应用程序中拥有一个搜索栏来搜索它的全部内容 或者我愿意索引的内容 的目标英语 实现的架构是 Jamstack 其中 gatsby 应用程序从 Strapi 应用程
  • 错误:“无法分配给‘Bool’类型的不可变表达式”?

    我该如何解决 我是一名新编码员 谢谢 我收到以下错误 无法分配给 Bool 类型的不可变表达式 当我尝试将 isSelected 设置为false and true IBAction func onFilter sender Any if
  • 使用 Sympy 方程进行绘图

    创建 Sympy 方程 求导 然后绘制该方程的结果的最佳方法是什么 我有符号方程 但无法弄清楚如何制作用于绘图的值数组 这是我的代码 from sympy import symbols import matplotlib pyplot as
  • 使用 protobuf-net 进行惰性、流驱动的对象序列化

    我们正在开发一个用于流式传输大量数据的 WCF 服务 因此我们选择使用WCF 流式传输 http msdn microsoft com en us library ms733742 aspx功能结合protobuf网络 http code
  • 如何区分用户是否处于订阅试用期或不在google play?

    我正在实现一项服务器端服务 用于检查用户的 google play 订阅状态 我使用 Android Publisher API https developers google com android publisher api ref p
  • Rails3 & Git & Heroku - 开发/登台服务器

    我有一个 Rails 3 应用程序 正在与一个使用 Git Github 的团队一起开发 并部署到 Heroku cedar 堆栈 我们的 Github 存储库有 2 个主要分支 Master 和 Development 我想定期将我们的开
  • REST 查询中的 UTF-8 编码字符未正确呈现

    我正在使用一个外部 REST 服务 该服务以 UTF 8 编码提供所有内容 由于某种原因 我的应用程序无法正确处理响应 如果我转储回复 我会看到像 Lule 应该是 Lule 这样的东西 编辑 如果我将字符串转发 不更改 到 UI 也会发生
  • 如何让 toString() 返回多行字符串?

    我正在开发一个程序 该程序搜索数组并找到最小值 然后打印出跑步者的时间 名字和姓氏 我需要弄清楚如何在不同的行上返回三个值 例如 public String toString return String format firstName l
  • Java 同步 String IllegalMonitorStateException

    我试图让 Thread2 等待 String 并让 Thread1 通知 String 更新 我确实同步了 String 对象 如下面的代码所示 但我仍然得到IllegalMonitorStateException这是我的代码 public