1. 首页
  2. 主题
  3. Go语言

go 语言 goroutine 与 主 goroutine 的代码的先行性问题。

demon_li · · 3721 次点击
本人新学Go语言,有个问题一直没找到相关资料,请高手帮忙解答以下。 在Java中,多个线程之间,只有保证了 先行性问题,才能保证不同线程的代码是按预期的先后顺序执行 以下是示例代码: ```go package main import ( "fmt" ) func main() { // 构建一个通道 ch := make(chan int) // 开启一个并发匿名函数 go func() { fmt.Println("start goroutine") //1 // 通过通道通知main的goroutine ch <- 0 fmt.Println("exit goroutine") //2 }() fmt.Println("wait goroutine") //3 // 等待匿名goroutine <-ch fmt.Println("all done") //4 } ``` 输出结果: 执行了多次一直是这个结果,与java学到的线程相关知识不匹配。 ``` go wait goroutine start goroutine exit goroutine all done ``` 为什么 1和3 不是随机出现的, 2和4 不是随机出现的。 1和3 是2个不同goroutine,不是应该不能保证哪行代码先执行吗。
如果你需要lock,就直接用lock chan不是用来解决这个问题的......
#5
更多评论
我觉得你啊可能对线程有一些误解.java的线程也不是你想的那样.你得到这个结果一点都不奇怪. 当前执行的线程或者协程是不会马上放弃CPU给其他线程和线程的除非使用了相关的语句和遇到了可以放弃CPU的情况, 你的例子就是这种情况.
#1
package demon.research; public class BefortTest { public static Object lock = new Object(); public static void main(String[] args) { try{ Thread t = new Thread(new Runnable() { @Override public void run() { System.out.println(&#34;start&#34;); synchronized (lock) { lock.notifyAll(); } System.out.println(&#34;end&#34;); } }); t.start(); System.out.println(&#34;wait&#34;); synchronized (lock) { lock.wait(); } System.out.println(&#34;end all&#34;); } catch (Exception ex) { } } } 打印结果出现以下结果: wait start end all end 所以Java 代码一定有先行性的考虑,你的解释是不正确的。
#2

用户登录

没有账号?注册

今日阅读排行

    加载中

一周阅读排行

    加载中