关于多线程

qq_38709999 2019-05-11 02:06:43
package com.example;
public class SYN {
public synchronized void fun1() {
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" fun1");
}
public synchronized void fun2() {
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" fun2");
}
}
两个线程分别死循环调用这两个方法,同一个SYN对象
输出示例
Thread-1 fun2
Thread-1 fun2
Thread-1 fun2
Thread-1 fun2
Thread-1 fun2
Thread-1 fun2
Thread-0 fun1
Thread-1 fun2
Thread-1 fun2
方法调用后释放锁,为什么可以连续抢到这么多次

ps:写生产者消费者时遇到的,完整代码在我博客里,不过这些应该够了
...全文
516 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhiwei.j 2019-05-17
  • 打赏
  • 举报
回复
synchronized本来就不能保证竞争的公平性,产生饥饿也是正常的。可能你在不同的平台实验所得到结果都会有所差异,没啥好纠结的。
qq_38709999 2019-05-16
  • 打赏
  • 举报
回复
引用 8 楼 jinggangshi 的回复:
[quote=引用 3 楼 warning与error的爱情 的回复:] [quote=引用 2 楼 jinggangshi 的回复:] 你的同步没有Lock对象,也没有Notify,也没有Wait,只有Sleep,那就看谁愿意Sleep ,并没有控制
为什么要加lock,synchronized不能完成吗,我调用方法的时候都是同一个SYN对象,不wait是想在同步执行完再释放,而不是执行中就释放,sleep在同步中,只有一个线程能到sleep这里,应该不存在抢时间片执行吧?望指点[/quote] 我的理解,synchronized只是定义了同步块,但并不规定执行顺序,当你没有wait和notify时,Thread.sleep(outtime)只是休眠了线程,并没有释放Lock对象,而休眠完成后后继续执行,直到完成,就是说是非控的,你的synchronized和Lock并没有起作用。[/quote] 哈哈,我的意思是,我理解sleep不释放锁,但我是循环调用同步代码块,每一次同步代码块执行完释放锁,下一次循环的时候总要多个线程抢锁,我纠结的就是此时总是同一个线程抢到了很多次,即执行了很多次循环
住手丶让我来 2019-05-16
  • 打赏
  • 举报
回复
要有lock吧,不然不会抢成这样子的
jinggangshi 2019-05-16
  • 打赏
  • 举报
回复
引用 3 楼 warning与error的爱情 的回复:
[quote=引用 2 楼 jinggangshi 的回复:]
你的同步没有Lock对象,也没有Notify,也没有Wait,只有Sleep,那就看谁愿意Sleep ,并没有控制

为什么要加lock,synchronized不能完成吗,我调用方法的时候都是同一个SYN对象,不wait是想在同步执行完再释放,而不是执行中就释放,sleep在同步中,只有一个线程能到sleep这里,应该不存在抢时间片执行吧?望指点[/quote]
我的理解,synchronized只是定义了同步块,但并不规定执行顺序,当你没有wait和notify时,Thread.sleep(outtime)只是休眠了线程,并没有释放Lock对象,而休眠完成后后继续执行,直到完成,就是说是非控的,你的synchronized和Lock并没有起作用。
qq_38709999 2019-05-15
  • 打赏
  • 举报
回复
引用 4 楼 qq_39936465 的回复:
[quote=引用 楼主 warning与error的爱情 的回复:] package com.example; public class SYN { public synchronized void fun1() { try { Thread.currentThread().sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" fun1"); } public synchronized void fun2() { try { Thread.currentThread().sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" fun2"); } } 两个线程分别死循环调用这两个方法,同一个SYN对象 输出示例 Thread-1 fun2 Thread-1 fun2 Thread-1 fun2 Thread-1 fun2 Thread-1 fun2 Thread-1 fun2 Thread-0 fun1 Thread-1 fun2 Thread-1 fun2 方法调用后释放锁,为什么可以连续抢到这么多次 ps:写生产者消费者时遇到的,完整代码在我博客里,不过这些应该够了
除非你设置控制,不然完全看天意,可能下次运行的结果就不一样了。[/quote] 因为测试了很多次,结果总是这种一个线程抢了一连串的时间片,感觉很诡异
qq_39936465 2019-05-15
  • 打赏
  • 举报
回复
引用 楼主 warning与error的爱情 的回复:
package com.example;
public class SYN {
public synchronized void fun1() {
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" fun1");
}
public synchronized void fun2() {
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" fun2");
}
}
两个线程分别死循环调用这两个方法,同一个SYN对象
输出示例
Thread-1 fun2
Thread-1 fun2
Thread-1 fun2
Thread-1 fun2
Thread-1 fun2
Thread-1 fun2
Thread-0 fun1
Thread-1 fun2
Thread-1 fun2
方法调用后释放锁,为什么可以连续抢到这么多次

ps:写生产者消费者时遇到的,完整代码在我博客里,不过这些应该够了



除非你设置控制,不然完全看天意,可能下次运行的结果就不一样了。
qq_38709999 2019-05-15
  • 打赏
  • 举报
回复
引用 2 楼 jinggangshi 的回复:
你的同步没有Lock对象,也没有Notify,也没有Wait,只有Sleep,那就看谁愿意Sleep ,并没有控制
为什么要加lock,synchronized不能完成吗,我调用方法的时候都是同一个SYN对象,不wait是想在同步执行完再释放,而不是执行中就释放,sleep在同步中,只有一个线程能到sleep这里,应该不存在抢时间片执行吧?望指点
qq_39936465 2019-05-15
  • 打赏
  • 举报
回复
引用 5 楼 warning与error的爱情 的回复:
除非你设置控制,不然完全看天意,可能下次运行的结果就不一样了。


因为测试了很多次,结果总是这种一个线程抢了一连串的时间片,感觉很诡异[/quote]


根你本机环境也有关系,总之这个都是非可控的。
jinggangshi 2019-05-15
  • 打赏
  • 举报
回复
你的同步没有Lock对象,也没有Notify,也没有Wait,只有Sleep,那就看谁愿意Sleep ,并没有控制
Unicode Escapes 2019-05-11
  • 打赏
  • 举报
回复
你左手有瓶可乐,右手同样有瓶可乐。饥渴状态下,是不是会举起一只手连喝几口,然后在放下;下次举起哪支手就随机了吧

这是在不考虑习惯左手或者右手,即线程优先级的情况下。

开个玩笑,别介意

62,626

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧