go并发编程之美(一)、go与java并发编程对比_java

在java中由于创建的线程与os线程一一对应,所以java中的每个线程占用一个时间片来运行。而go中多个协程对应一个os 线程,也就是多个协程对应了一个时间片,go则使用自己的调度策略(非os的调度策略)来让多个协程使用一个时间片来并发的运行。也就是go中存在两级策略,一个是go语言层面的调度多个协程公用一个时间片,一个是os层面的调度多个逻辑处理器轮询占用不同的时间片。

二、创建协程

在java中创建一个线程:

public static void main(String[] args) {

    Thread thread = new Thread(() -> {

        //run method dosomthing
    });
    thread.start();
}

注: 如上代码创建了一线程并启动,在java中存在用户线程与deamon线程之分,当不存在用户线程时候,jvm进程就退出了(而不管main函数所在线程是否已经结束).

在go中创建一个协程:

func main() {

    //开启一个协程,执行匿名函数里面的内容
    go func(){
        //do somthing
        fmt.Println("im a go 协程")
    }()
    
    //休眠10s
    time.Sleep(10 \* time.Second)

}


注意: 如上通过go关键字开启一个协程,执行匿名函数里面的内容,这里需要注意main函数所在线程需要休眠以下,以便等开启的协程执行,这是因为go中只要main函数线程退出则进程就退出。

三、同步

在java中我们可以使用Semaphore、CountDownLatch、CyclicBarrier等进行多线程之间同步,比如下面例子:

public final static Semaphore SEMAPHORE = new Semaphore(0);
    public static void main(String[] args) throws InterruptedException {

        Thread thread1 = new Thread(() -> {

            try {
                //run method dosomthing
                System.out.println(Thread.currentThread().getName() + "done");
            }finally {
                SEMAPHORE.release();
            }
            
        },"thread-1");
        thread1.start();
        
        
        Thread thread2 = new Thread(() -> {

            try {
        

[video(video-8PGqMbZO-1716354551447)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=1804892953)(image-https://img-blog.csdnimg.cn/img_convert/d03a705143646f4f3f6ea879d59b2788.png)(title-必看视频!获取2024年最新Java开发全套学习资料 备注Java)]

        //run method dosomthing
                System.out.println(Thread.currentThread().getName() + "done");

            }finally {
                SEMAPHORE.release();
            }
            
        },"thread-2");
        thread2.start();
        
        System.out.println("wait all sub thread end");
        SEMAPHORE.acquire(2);
        System.out.println("all sub thread end");

    }


在go中也有类似的工具类:

//创建同步器
var wg sync.WaitGroup

func main() {
    //两个信号
    wg.Add(2)

    //开启一个协程,执行匿名函数里面的内容
    go func() {
        //信号量减去1
        defer wg.Done()

        //do somthing
        fmt.Println("im A go 协程")

    }()

    //开启一个协程,执行匿名函数里面的内容
    go func() {
        //信号量减去1
        defer wg.Done()

        //do somthing
        fmt.Println("im B go 协程")

    }()

    fmt.Println("wait all sub thread end")
    wg.Wait()
    fmt.Println(" all sub thread end")

}


四、通道

go中通道分为有缓冲和无缓冲的,本节我们看如何使用有缓冲通道实现生产消费模型

var wg sync.WaitGroup

func printer(ch chan int) {
    for i := range ch {
        fmt.Println(i)


### 最后

小编精心为大家准备了一手资料

![](https://img-blog.csdnimg.cn/img_convert/8bd7eaa1cae9cf0abbdbcead55bf3226.webp?x-oss-process=image/format,png)


![](https://img-blog.csdnimg.cn/img_convert/e7ab43968700f732c5664ef7259742a3.webp?x-oss-process=image/format,png)

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

1.  BAT面试的20道高频数据库问题解析
2.  Java面试宝典
3.  Netty实战
4.  算法

![](https://img-blog.csdnimg.cn/img_convert/b2549a075c29a8e7f13be9d2c22dbac2.webp?x-oss-process=image/format,png)

**BATJ面试要点及Java架构师进阶资料**

![](https://img-blog.csdnimg.cn/img_convert/583c80cb60dc46208e942c680bd44d85.webp?x-oss-process=image/format,png)



1.  BAT面试的20道高频数据库问题解析
2.  Java面试宝典
3.  Netty实战
4.  算法

[外链图片转存中...(img-aFi5ogNR-1716441417246)]

**BATJ面试要点及Java架构师进阶资料**

[外链图片转存中...(img-eDrxIV04-1716441417246)]

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值