首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >初始化死锁

初始化死锁
EN

Stack Overflow用户
提问于 2017-05-13 02:33:32
回答 2查看 120关注 0票数 0

为什么这会在一开始就陷入僵局--它打印一行,然后冻结(在编辑建议之后)?

这可能是因为第一个线程在开始等待之前错过了通知触发器。

决议是什么?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class threadTwo{
    AtomicInteger i=new AtomicInteger(0);
    Boolean b=new Boolean(false);

    class firstThread implements Runnable{
        AtomicInteger i;
        Boolean b;
        firstThread(AtomicInteger i,Boolean b){
            this.i=i;
            this.b=b;
        }
        public void run(){
            while(true){
                synchronized(i){
                    try{
                        while(b==false)
                            i.wait();

                        if(i.intValue()<30){
                            i.incrementAndGet();
                            System.out.println( Thread.currentThread().getId() + " - " + i.intValue());
                        }
                        b=false;
                        i.notify();

                    }catch(InterruptedException x){}
                }
            }
        }       
    }

    class secondThread implements Runnable{
        AtomicInteger i;
        Boolean b;
        secondThread(AtomicInteger i,Boolean b){
            this.i=i;
            this.b=b;
        }
        public void run(){
            while(true){
                synchronized(i){
                    try{
                        while(b==true)
                                i.wait();

                        if(i.intValue()<40){
                            i.getAndAdd(2);
                            System.out.println( Thread.currentThread().getId() + " - " + i.intValue());
                        }
                        b=true;
                        i.notify();

                    }catch(InterruptedException x){}
                }
            }
        }       
    }

    void runThread(){ 
        Thread t1 = new Thread(new firstThread(i,b));
        Thread t2 = new Thread(new secondThread(i,b));
        t1.start();
        t2.start();
        try{
            t1.join();
            t2.join();
        }catch(Exception e){}
        System.out.println("Result : " + i.intValue());
    }

    public static void main(String[] args){
        new threadTwo().runThread();

    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-13 02:59:45

问题是b.wait()firstThread中。这个变量b从未从secondThread中得到通知,因为secondThread在检查if(b==true)上失败并立即返回。

但是也要注意,通过变量b进行同步是非常糟糕的,因为b=false;b=true;语句正在为变量分配新实例,因此firstThreadsecondThread失去了它们的连接。

票数 2
EN

Stack Overflow用户

发布于 2017-05-13 03:24:23

如果我正确地猜到了代码的意图,那么就会出现不必要的同步和等待通知。试一试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyThread
{
    AtomicInteger i = new AtomicInteger(0);
    Boolean b = new Boolean(false);

    class FirstThread implements Runnable
    {
        AtomicInteger i;
        Boolean b;

        FirstThread(AtomicInteger i, Boolean b)
        {
            this.i = i;
            this.b = b;
        }

        public void run()
        {
            while (i.intValue() < 30)
            {
                i.incrementAndGet();
                System.out.println(Thread.currentThread().getId() + " - " + i.intValue());
            }
        }
    }

    class SecondThread implements Runnable
    {
        AtomicInteger i;
        Boolean b;

        SecondThread(AtomicInteger i, Boolean b)
        {
            this.i = i;
            this.b = b;
        }

        public void run()
        {
            while (i.intValue() < 40)
            {
                i.getAndAdd(2);
                System.out.println(Thread.currentThread().getId() + " - " + i.intValue());
            }
        }
    }

    void runThread()
    {
        Thread t1 = new Thread(new FirstThread(i, b));
        Thread t2 = new Thread(new SecondThread(i, b));
        t1.start();
        try
        {
            t1.join();
        }
        catch (InterruptedException exc)
        {
            exc.printStackTrace();
        }
        t2.start();
        try
        {
            t2.join();
        }
        catch (InterruptedException exc)
        {
            exc.printStackTrace();
        }
        System.out.println("Result : " + i.intValue());
    }

    public static void main(String[] args)
    {
        new MyThread().runThread();

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

https://stackoverflow.com/questions/43952068

复制
相关文章
python 用装饰器给函数增加参数
from functools import wraps import inspect def optional_debug(func): if 'debug' in inspect.getargspec(func).args: raise TypeError('debug argument already defined') @wraps(func) def wrapper(*args, debug=False, **kwargs): if debug: print('Call
用户5760343
2019/12/12
7480
在TypeScript中使用装饰器
Decorator装饰器是ES7的时候提案的特性,目前处于Stage 3候选阶段(2022年10月)。
luciozhang
2023/04/22
1.2K0
在TypeScript中使用装饰器
在JavaScript中使用装饰器
Decorator装饰器是ES7的时候提案的特性,目前处于Stage 3候选阶段(2022年10月)。
luciozhang
2023/04/22
5350
在JavaScript中使用装饰器
python装饰器2:类装饰器
"类装饰器"有两种解读方式:用来装饰类的装饰器;类作为装饰器装饰其它东西。你如何认为取决于你,两种说法都有出现在其它的文章中。我的文章中是将"类装饰器"解读为第一种方式,即装饰类的东西。而“类作为装饰器装饰其它东西”,我都会为其标注"类作为装饰器"或"作为装饰器的类"以避免歧义。
py3study
2020/01/19
1.2K0
在Vue中初次使用装饰器(Decorator)
---- 1. 扩展eslintConfig配置 { "eslintConfig": { ... "parserOptions": { ... "ecmaFeatures": { "legacyDecorators": true } } ... } } 2. 关闭Vetur提示(项目级别) { "vetur.validation.script": false, } 3. 新建装饰器函数: src\d
前端小鑫同学
2022/12/25
1.5K0
在Vue中初次使用装饰器(Decorator)
装饰器
 一、装饰器的简单介绍 1 # /usr/bin/env python 2 # -*- coding:utf-8 -*- 3 ''' 装饰器 ''' 4 ''' 5 装饰器的工作原理 6 1. python的执行顺序是从上到下顺序执行. 7 2. 当执行到outer函数的时候, 将其内容放入内存, 执行到f1的时候.在f1上发现@outer装饰器. 8 3. 执行outer函数, 并将其下的函数名f1作为参数传递给outer 9 4. 将out
用户7798898
2022/05/06
2530
装饰器
def fun(): def fun1(num): return num+1 return fun1 c = fun() print(c(1)) 在主函数中不能直接调用嵌套函数里的子函数如:fun1(num),需要先调用嵌套中的母函数如:fun(),然后把fun()函数中的子函数fun1()的地址传递给一个变量,然后才可以直接调用子函数fun1 一下是装饰器函数的标准模式,可以采用断点debug来一步步运行深入理解函数执行步骤 装饰器编码思路:将新的函数地址赋值给旧的函数,
IT人一直在路上
2019/09/18
3660
装饰器
一。关于装饰器: 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能 原则:1.不能修改被装饰函数的源代码 2.不能修改被装饰函数的调用方式 二.实现装饰器知识必备技能: 1.函数即“变量” 2.高阶函数 a.把一个函数名当做实参传给另外一个函数(在不修改被装饰函数源代码下为其添加功能) b.返回值中包含函数名(不修改函数的调用方式) 3.嵌套函数 高阶函数 +嵌套函数=》装饰器 2.1函数即“变量”(一切皆对象) 在 python中,一切皆对象,变量是对象,函数是对象,类是对象,所有的一切都是对
用户1679793
2018/04/28
7240
装饰器
装饰器
初创公司有N个业务部门,1个基础平台部门,基础平台负责提供底层的功能,如:数据库操作、redis调用、监控API等功能。业务部门使用基础功能时,只需调用基础平台提供的功能即可。如下:
hankleo
2022/05/10
2410
装饰器
装饰器Decorators是Python的重要组成部分。 简而言之:它们是修改另一个函数功能的函数。 他们有助于使我们的代码更简洁,更Pythonic。
Helloted
2022/06/07
3050
装饰器
def f2(func): #定义一个函数加参数,其中的func参数为装饰器的函数体 def f3(w1,w2) #这个函数可以进行w1,w2参数 print("吴永聪") #输出吴永聪 ret = func(w1,w2) #装饰函数体的参数并将其赋给ret print("123") #输出123 return ret #返回ret的值 return f3 #返回f3函数的参数 @f2 #@使用装饰器
Wyc
2018/09/11
3510
python装饰器1:函数装饰器详解
假如你已经定义了一个函数funcA(),在准备定义函数funcB()的时候,如果写成下面的格式:
py3study
2020/01/19
6940
Python高级编程-装饰器1.装饰器的理解 2.多个装饰器 3.装饰器(decorator)功能 4.装饰器示例
装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是Python面试中必问的问题,但对于好多初次接触这个知识的人来讲,这个功能有点绕,自学时直接绕过去了,然后面试问到了就挂了,因为装饰器是程序开发的基础知识,这个都不会,别跟人家说你会Python,看了下面的文章,保证你学会装饰器。
Python攻城狮
2018/08/23
5370
Python高级编程-装饰器1.装饰器的理解
2.多个装饰器
3.装饰器(decorator)功能
4.装饰器示例
TypeScript系列教程十一《装饰器》 -- 属性装饰器
属性装饰器和其他装饰器功能类似,其设计也是为了统一的、复用度更高的去监听,改变属性。
星宇大前端
2022/05/06
1K0
TypeScript系列教程十一《装饰器》 -- 属性装饰器
函数的装饰器,两层装饰器和三层装饰器
两层函数装饰器个人觉得他其实就是把需要装饰的函数名丢入形参,然后用一个嵌套的函数对其头尾进行添加程序,但是不能减少他的程序内容,他的原来程序不变只能增不能减少,然后返回装饰好的子函数,再全局定义一个变量名与要装饰的函数名相同名字,并且将装饰后的函数调用赋予改变量.
小小咸鱼YwY
2019/07/24
7890
ArkTS-@Observed装饰器和@ObjectLink装饰器
上文所属的装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的 数据模型。对于多层嵌套的情况,比如二维数组,或者数组项class,或者class的属性是class,他们的第二层的属性变化是无法观察到的。这就引出了@Observed/@ObjectLink装饰器
酒楼
2023/07/05
7490
TypeScript系列教程十一《装饰器》 -- 参数装饰器
系列教程 TypeScript系列教程一《开篇》 TypeScript系列教程二《安装起步》 TypeScript系列教程三《基础类型》 TypeScript系列教程四《扩展类型》 TypeScript系列教程五《对象类型》》 TypeScript系列教程六《泛型》 TypeScript系列教程七《接口》 TypeScript系列教程八《类》 TypeScript系列教程九《高级类型》 TypeScript系列教程九《类型转换》-- keyof和typeof 操作 TypeScript系列教程九《类型转换》
星宇大前端
2022/05/06
6370
TypeScript系列教程十一《装饰器》 -- 参数装饰器
TypeScript系列教程十一《装饰器》 -- 类装饰器
类装饰器顾名思义是对类的内容进行修饰,在Typescript 类其实就是对象,这样配合原型对象操作可以达到操作类的目的。
星宇大前端
2022/05/06
7950
TypeScript系列教程十一《装饰器》 -- 类装饰器
ArkTS-@Provide装饰器和@Consume装饰器
@Provide和@Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过明明参数机制传递,@Provide和@Consume拜托参数传递机制的舒服,实现跨层级传递。其中@Provide装饰的变量是在祖先结点中,可以理解为被”提供“给后代的状态变量。@Consume装饰的变量是在后代组件中,去“消费(绑定)”祖先节点提供的变量。
酒楼
2023/06/27
4840
python2装饰器_python内置装饰器
我们都知道装饰器的作用是在不改变原有的代码基础上,添加新的功能,但是这样会有一个弊端,被装饰的函数某些属性会变改变,接下来我们来看下
全栈程序员站长
2022/09/19
3780

相似问题

twilio_view装潢师总是在生产中给403个

25

用户:给403页

16

阿帕奇给403禁用

32

装饰器不将对象返回给get方法

113

Laravel + NGINX给403被禁

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文