两个线程交替打印0-100

大佬们,我有个问题,可以帮忙解决下吗。🥹🥹
问题:两个线程交替打印0-100,当我使用了for循环,为什么会重复打印?
结果是
线程一打印0
线程二打印0
线程一打印1
线程二打印1

线程一打印100
线程二打印100

当我把变量i改为static修饰为共享数据时,问题就解决了。但是我不是只new了一次pk对象,也就是说我不加static不也是两个线程共享变量i吗?那不应该不会重复打印吗?
代码如下 谢谢大佬们
class p2 {    public static void main(String[] args) {        pk p=new pk();        Thread t1=new Thread(p);        Thread t2=new Thread(p);        t1.setName("线程一");        t2.setName("线程二");        t1.start();        t2.start();    }}class pk implements Runnable{    public void run() {        synchronized (this) {            for(int i=0;i<=100;i++) {                System.out.println(Thread.currentThread().getName()+"在打印数字"+i);                notify();                try {                    wait();                } catch (Exception e) {                    throw new RuntimeException();                }            }        }    }} #Java#  #多线程#
全部评论
你这里for循环里面int i = 0 变成线程局部变量,所以会循环打印但是没有共享到i
2 回复 分享
发布于 2023-05-28 22:26 浙江
你把i放到pk类 里面,for写成for(;i<100;i++)
2 回复 分享
发布于 2023-05-28 22:27 浙江
感觉可能因为i是局部变量,每个线程私有所以会重复打印。然后加了static后所有线程共享所以不重复了。
1 回复 分享
发布于 2023-05-27 11:36 福建
肯定涉及到了线程之间的同步问题啊
点赞 回复 分享
发布于 2023-05-27 06:56 广东
好有道理
点赞 回复 分享
发布于 2023-05-27 08:16 山东
方法内局部变量线程私有
点赞 回复 分享
发布于 2023-05-27 16:23 上海
这种交替的直接用semphere,很方便
点赞 回复 分享
发布于 2023-06-22 18:21 江苏

相关推荐

面经:‌一面(‌HR面)‌‌:‌自我介绍,‌强调与岗位相关的能力和经验。‌职业规划,‌说明对公司和岗位的理解及未来发展规划。‌案例题,‌根据公司行业进行回答,‌考验临场发挥能力。‌反问环节,‌可询问岗位匹配度、‌团队情况、‌培训安排等。‌‌二面(‌部门主管面)‌‌:‌深入挖掘简历,‌关注实习经历、‌工作业绩及解决困难的能力。‌讨论生鲜电商行业看法及未来职业发展打算。‌薪酬待遇讨论,‌确认能否接受工作条件。‌‌其他注意事项‌:‌面试过程可能包括无领导小组讨论,‌考察团队协作和领导能力。‌面试前需做好充分准备,‌包括了解公司概况、‌岗位要求等。‌‌🥬叮咚买菜2025届校园招聘启动啦!【公司介绍】叮咚买菜于2021年成功在美国纽交所上市,为4500万用户提供品质好、时间快、品类全的生鲜消费体验,是中国成长迅速、规模领先的生鲜供应链企业。【超多岗位】咚力生(管理方向)、数据分析、商品开发、商品品质管控、商品运营、视觉设计、新媒体运营等岗位城市:上海、深圳、杭州、北京、无锡、南京、苏州、常州、芜湖、东莞等薪酬福利:优厚薪资+六险一金+员工关怀内推链接:http://campus.100.me/campus/jobs?shareId=c1377c9f-677d-4631-9247-c855aa43d4a7&amp;shareSo内推码:ESVGHA(简历优先筛选,后续有流程上的问题欢迎随时联系)使用内推码简历优先筛选,有任何问题包括进度查询可以私信我,内推后在评论区留言【姓名缩写+岗位】,方便捞人和确认投递状态
叮咚买菜
|
校招
|
超多精选岗位
点赞 评论 收藏
分享
点赞 评论 收藏
分享
6 17 评论
分享
牛客网
牛客企业服务