Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >话说 synchronized

话说 synchronized

原创
作者头像
木子的昼夜
修改于 2021-03-02 06:23:29
修改于 2021-03-02 06:23:29
5240
举报

一、前言

代码语言:txt
AI代码解释
复制
    说起java的锁呀,我们先想到的肯定是synchronized[ˈsɪŋ krə naɪ zd]了 ,这个单词很拗口,会读这个单词在以后的面试中很加分(我面试过一些人 不会读  ,他们说的是syn开头那个单词),不会读略显不专业,不过问题不大,会用,懂原理才是最重要的。
代码语言:txt
AI代码解释
复制
 内容会由简入难,有时候可以放弃一部分难的东西。 标记一下 回头再看 可能更加明朗

二、DEMO

代码语言:txt
AI代码解释
复制
	废话不多说,先写hello world !!
代码语言:txt
AI代码解释
复制
    例子: 小强 和  小明 同居了,但是只有一个厕所,他们每天必做的事情就是抢坑位,那么用代码实现要怎么写呢 ?
代码语言:txt
AI代码解释
复制
/**
 * @author 木子的昼夜
 * <p>
 * 人 实体类
 */
public class Person {
    // 名字
    private String name;
    // 上厕所
    public void gotoWc() {
        Wc.useWc(this);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

/**
 * @author 木子的昼夜
 *
 * 厕所 实体类
 */
public class Wc {
    /**
     * 使用厕所方法
     * @param p 使用厕所的人
     */
    public static void useWc(Person p){
        try{
            System.out.println(p.getName()+" 正在使用厕所!!");
            TimeUnit.SECONDS.sleep(10);
            System.out.println(p.getName()+" 用完了!!");
        } catch (Exception e) {
            // 厕所万一坏了 也得结束使用
            System.out.println(p.getName()+" 用完了!!");
        }
    }
}


/**
 * @author 木子的昼夜
 * 这个测试 是小强与小明商量好了 说小强你先来   小强完事儿了  小明再来  
 * 这个不会发生冲突 因为是商量好的 顺序执行 
 * 大家都知道  顺序是不会出什么问题的 
 */
public class SyncTest {
    public static void main(String[] args) {
        // 小强对象
        Person xiaoqiang = new Person();
        xiaoqiang.setName("小强");

        // 小明对象
        Person xiaoming = new Person();
        xiaoming.setName("小明");

        // 上厕所
        xiaoqiang.gotoWc();
        xiaoming.gotoWc();
    }

}

上厕所过程:

上厕所过程.png
上厕所过程.png

如果俩人没商量,自己去自己的呢 ?

代码语言:txt
AI代码解释
复制
/**
 * @author 木子的昼夜
 */
public class SyncTest02 {
    public static void main(String[] args) {
        // 小强对象
        Person xiaoqiang = new Person();
        xiaoqiang.setName("小强");

        // 小明对象
        Person xiaoming = new Person();
        xiaoming.setName("小明");

        // 开启两个线程 谁也不理谁 自己干自己的 
        new Thread(()->xiaoqiang.gotoWc()).start();
        new Thread(()->xiaoming.gotoWc()).start();
    }

}

上厕所过程:

上厕所过程02.png
上厕所过程02.png

上图很明显可以看出来,小强没上完呢,小明就去上了,

要是小的还凑活,大的怎么办? 画面自己想~~

这个时候大家可能想到了,厕所门上没锁吗? 谁先进去锁住不就行了吗?

答对了!

bg.gif
bg.gif
代码语言:txt
AI代码解释
复制
/**
 * @author 木子的昼夜
 *
 * 改造后 厕所 实体类
 */
public class Wc {
    /**
     * 使用厕所方法
     * synchronized: 谁先进厕所 马上上锁 !!
     * @param p 使用厕所的人
     */
    public static synchronized void useWc(Person p){
        try{
            System.out.println(p.getName()+" 正在使用厕所!!");
            TimeUnit.SECONDS.sleep(10);
            System.out.println(p.getName()+" 用完了!!");
        } catch (Exception e) {
            // 厕所万一坏了 也得结束使用
            System.out.println(p.getName()+" 用完了!!");
        }
    }
}

/**
 * @author 木子的昼夜
 */
public class SyncTest02 {
    public static void main(String[] args) {
        // 小强对象
        Person xiaoqiang = new Person();
        xiaoqiang.setName("小强");

        // 小明对象
        Person xiaoming = new Person();
        xiaoming.setName("小明");

        // 开启两个线程 谁也不理谁 自己干自己的  但是这次厕所有锁,
        // 谁先进去 就把锁锁住 
        new Thread(()->xiaoqiang.gotoWc()).start();
        new Thread(()->xiaoming.gotoWc()).start();
    }

}

上厕所过程:

上厕所过程03.png
上厕所过程03.png

可以看到,小强先上完,小明再上的,这样就不会出什么问题了。

有人可能会问了,只见上锁,没有解锁,小明怎么进去的?

这就是synchronized的一个特性了,它会自动释放锁,

synchronized包裹的代码执行完之后或发生异常时,锁就自动释放了。

所以避免了忘记释放锁,带来的尴尬~

三、假装学术讨论

3.1 为什么要上锁?

以厕所为例,自己想去吧。 提出:”共享资源“ 这个词就对了

3.2 对象锁 类锁

1) 对象锁 顾名思义 就是锁一个对象

代码语言:txt
AI代码解释
复制
/**
 * @author 木子的昼夜
 * 对象锁
 */
public class SyncObject {

    /**
     * 累加值 (共享资源)
     */
     int count = 0;
    /**
     * 锁对象
     */
    private Object lock = new Object();

    public static void main(String[] args) {
        SyncObject so = new SyncObject();

        // 线程1
        new Thread(()->{
            try {
                for (;;){
                    TimeUnit.SECONDS.sleep(2);
                    so.increaseCount();
                }
            } catch (Exception e) {
                System.err.println("错误");
            }
        },"线程1").start();

        // 线程2
        new Thread(()->{
            try {
                for (;;){
                    TimeUnit.SECONDS.sleep(2);
                    so.increaseCount();
                }
            } catch (Exception e) {
                System.err.println("错误");
            }
        },"线程2").start();
    }

    /**
     * count累加
     */
    public void increaseCount(){
        // 加锁
        synchronized (lock){
            count = count+1;
            System.out.println(Thread.currentThread().getName()+" count="+count);
        }
    }
}

例子中:两个线程增加count ,锁的是lock这个对象 ,这就叫对象锁 。

有时候会看见synchronized(this) 这是什么锁 ? this嘛 就是指当前对象,也是对象锁,

synchronized(this) 相当于 在方法上加synchronized,下边这两个方法都是锁的当前对象

代码语言:txt
AI代码解释
复制
	 /**
     * count累加
     */
    public void increaseCount(){
        // 加锁
        synchronized (this){
            count = count+1;
            System.out.println(Thread.currentThread().getName()+" count="+count);
        }
    }

    /**
     * count累加  加锁
     */
    public synchronized void  increaseCount02(){
            count = count+1;
            System.out.println(Thread.currentThread().getName()+" count="+count);
    }
代码语言:txt
AI代码解释
复制
  2) *类锁  顾名思义 就是给一个类加锁* 
代码语言:txt
AI代码解释
复制
 每个类load到内存之后呢,会生成一个Class类型的对象  锁的就是他 
代码语言:txt
AI代码解释
复制
其实也是锁一个对象 只是这个对象比较特殊,它代表类
代码语言:txt
AI代码解释
复制
/**
 * @author 木子的昼夜
 * 对象锁
 */
public class SyncObject03 {

    /**
     * 累加值 (共享资源)
     */
    static int count = 0;
    /**
     * 锁对象
     */
    private Object lock = new Object();

    public static void main(String[] args) {
        SyncObject03 so = new SyncObject03();

        // 线程1
        new Thread(()->{
            for (;;){
                SyncObject03.increaseCount();
            }
        },"线程1").start();
        
        // 线程2
        new Thread(()->{
            for (;;){
                SyncObject03.increaseCount();
            }
        },"线程2").start();

    }

    /**
     * count累加
     */
    public synchronized static void increaseCount(){
        // 加锁
        try {
            count = count+1;
            System.out.println(Thread.currentThread().getName()+" count="+count);
            TimeUnit.SECONDS.sleep(1);
        } catch (Exception e){
            System.err.println("错误~");
        }
    }

    /**
     * count累加
     */
    public   void increaseCount02(){
        synchronized(SyncObject03.class){
            // 加锁
            try {
                count = count+1;
                System.out.println(Thread.currentThread().getName()+" count="+count);
                TimeUnit.SECONDS.sleep(1);
            } catch (Exception e){
                System.err.println("错误~");
            }
        }
    }

}

以上两种方式 都是类锁。

3.3 上锁方法执行的时候 可以执行当前对象未上锁方法吗?

这是一个用脚指头就能想到的答案,但是好多面试官问。 问了之后呢 你就蒙了~~ 难道不能?

答案是:能!

为什么能呢?因为爱所以爱~~ 错了,重来 .. 因为能所以能~~

小明在吃饭,给碗上个锁,别人不能用, 那小明能同时看他的偶像邓紫棋唱歌吗 ?

谁要是说不可以,以后吃饭不让他玩手机、pad、电脑 。 就让他吃吃吃 (那是猪)

hx.gif
hx.gif
代码语言:txt
AI代码解释
复制
/**
 * @author 木子的昼夜
 *  可能出现的面试题 
 */
public class SyncObject04 {


    private Object lock = new Object();

    public static void main(String[] args) throws InterruptedException {
        SyncObject04 so = new SyncObject04();

        // 线程1
        new Thread(()->{
            so.increaseCount();
        },"线程1").start();

        Thread.sleep(2000);

        // 线程2
        new Thread(()->{
            so.lookMv();
        },"线程2").start();
    }

    /**
     * 吃饭
     */
    public void increaseCount(){
        // 加锁
        synchronized (this){
            try{
                System.out.println("吃饭 ");
                // 也可以在吃饭这里 跟妹子聊天 
                chatWithGirl();
                TimeUnit.SECONDS.sleep(10);
            } catch (Exception e) {
                System.err.println("饭掉地上了~");
            }
            System.out.println("吃完饭 ");
        }
    }

    /**
     * 看演唱会视频
     */
    public  void  lookMv(){
        System.out.println("看演唱会视频");
    }
    
    /**
     * 看跟美女聊天
     */
    public  void  chatWithGirl(){
        System.out.println("跟美女聊天");
    }
}
nolock.png
nolock.png

3.4 可重入

能一句话总结吗?

咳咳: 同一线程可以调用加了同一把锁的两个方法 不会阻塞。

例子:同一个人可以用同一双筷子(筷子加锁),吃不同的菜~~

吃鱼的时候获取了锁,在吃鱼方法里调用吃沙拉方法,是可以调用成功了 因为两个方法用的同一把锁

代码语言:txt
AI代码解释
复制
/**
 * @author 木子的昼夜
 */
public class TestC {
    /**
     * 一双筷子 只能一个人同一时间使用(一个线程)
     */
    Object chopsticks   = new Object();

    public static void main(String[] args) {
        TestC c = new TestC();
        new Thread(()->{
            c.eatFish();
        }).start();

    }

    /**
     * 吃
     */
    public void eatFish( ) {
        synchronized (chopsticks) {
           try {
              System.out.println("吃 鱼");
              Thread.sleep(2000);
              eatSalad();
           } catch (Exception e){ }
        }
    }

    /**
     * 吃沙拉
     */
    public void eatSalad() {
        synchronized (chopsticks) {
            try {
                System.out.println("吃 沙拉");
                Thread.sleep(2000);
                eatFish();
            } catch (Exception e){ }
        }
    }
}

3.5 底层实现

(1) 简单版
代码语言:txt
AI代码解释
复制
jdk1.6之前 synchronized 是 重量级锁  什么是重量级锁? 就是每次锁都会去找操作系统申请锁。

jdk1.6及以后改进为锁升级

简单思路是:

代码语言:txt
AI代码解释
复制
synchronized(object)
  1. 线程A 第一个访问
  2. 偏向锁 只在object的markword 中记录线程A的线程ID
  3. 如果线程A 又进来访问 一看markword的线程号是自己 那就直接用
  4. 这时候线程B 来了 ,线程B 一看我擦? 有人占用了锁!
  5. 线程B 会循环死等 ,类似在厕所门口,敲敲门问问线程A 你好了吗?敲敲门问问线程A 你好了吗?敲敲门 问问线程A 你好了吗?敲敲门问问线程A 你好了吗?
  6. 线程B的这一操作,用术语将叫: 自旋锁
  7. 线程B 问10次之后,得不到锁,就会升级为重量级锁 (去操作系统申请资源)
  8. 无锁->偏向锁->自旋锁->重量级锁
  9. 锁 一般 。。 只升级 不降级
(2)复杂版
  1. CAS 简单叙述 了解入门
cas.png
cas.png

什么是ABA问题,假如你有媳妇儿,我说假如~ 以偷零花钱为例

https://www.processon.com/view/link/603c96ca07912913b4f2c55f

偷钱.png
偷钱.png
代码语言:txt
AI代码解释
复制
这是一个故事: 小强偷零花钱请小明吃饭的故事 

ABA 就是:

小强媳妇儿 出门看的钱是10万 (A)

小强偷拿1万 剩余9万(B)

小强找小月借了1万 放回去 总共10万(A)

小强媳妇儿回来 一看是10万,很满意。 但是 她不知道 这是偷梁换柱啊

后来小强媳妇儿看了我的博客 , 发现了秘密 ,她应该怎么解决呢 ?

关键字:version 版本号

她上班之前,在家里的存款上用笔写了一个版本,小强如果再偷钱,再还回来,这个版本就变了(+1)

这样就解决了ABA问题

2. 上锁过程
上锁过程.png
上锁过程.png

重度竞争: 耗时过长 自旋过多 wait等

新建对象可能直接是匿名偏向 ( 如果默认开启了偏向锁) ,因为没有偏向任何一个线程,所以是匿名偏向

JVM默认不开启 延迟4秒后才会开启 偏向锁

3. new 一个对象 长什么样 ? markword 是啥
对象样子.png
对象样子.png

1. 查看工具 : JOL (Java Object Layout )

直接maven引入就可以使用了

代码语言:txt
AI代码解释
复制
 <dependencies>
     <dependency>
         <groupId>org.openjdk.jol</groupId>
         <artifactId>jol-core</artifactId>
         <version>0.9</version>
     </dependency>
</dependencies>
代码语言:txt
AI代码解释
复制
/**
 * @author 木子的昼夜
 */
public class Person {
    long  money;

    public long getMoney() {
        return money;
    }

    public void setMoney(long money) {
        this.money = money;
    }
}

/**
 * @author 木子的昼夜
 */
public class JolTest {
    public static void main(String[] args) {
        Person p = new Person();
        System.out.println(ClassLayout.parseInstance(p).toPrintable());
    }
}

// 输出结果 
Person object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           01 00 00 00 
      4     4        (object header)                           00 00 00 00 
      8     4        (object header)                           43 c1 00 f8 
     12     4        (alignment/padding gap)                  
     16     8   long Person.money                              0
Instance size: 24 bytes
Space losses: 4 bytes internal + 0 bytes external = 4 bytes total
jol01.png
jol01.png

咦? 不是要写synchronized 吗 ?

2. markword

我给对象p 加锁,然后输出 layout 可以发现 markword 改变了

所以呢~~ 锁信息 是记录再markword中的

代码语言:txt
AI代码解释
复制
/**
 * @author 木子的昼夜
 */
public class JolTest {
    public static void main(String[] args) {
        Person p = new Person();
        System.out.println(ClassLayout.parseInstance(p).toPrintable());

        synchronized (p) {
            System.out.println(ClassLayout.parseInstance(p).toPrintable());
        }
    }
}
mk01.png
mk01.png

markword 这么厉害吗? 不 ! 它还能更厉害 。 我们看一下 它里边都记录了一些什么信息

先暂时看最后3bit 其他 不是很了解 这个时候可以对比上边layout的输出 看一下

刚开始是01 加锁之后变成了00 (没有开启偏向锁 直接到轻量级锁)

mk02.png
mk02.png
mk03.png
mk03.png

先看最后2bit:


00:轻量级锁 自旋锁

代码语言:txt
AI代码解释
复制
   自旋锁,耗CPU资源   是在用户态操作 不关联内核态 
代码语言:txt
AI代码解释
复制
	两个线程 争着把自己的Lock Record 放到markword中 
代码语言:txt
AI代码解释
复制
    谁先放进去,谁先获得锁,另一个人接着cas 去放 
自旋锁.png
自旋锁.png
代码语言:txt
AI代码解释
复制
    Lock Record 指向的是什么呢  是无锁状态的markword 

这就解释了 为什么hashcode不丢失的问题 因为有备份记录

代码语言:txt
AI代码解释
复制
这里锁重入: 上边提到了,锁重入 ,锁每进一次,都会加一个LR  从第二个LR开始 指向的就是一个null 
代码语言:txt
AI代码解释
复制
等锁退出 也就是monitorexit(锁代码块执行完 或 抛异常)的时候LR -1 ,LR -1 ,LR -1 一直减  ,退一次减一次 

10:重量级锁

代码语言:txt
AI代码解释
复制
  向OS 申请锁,进了内核态  , c++ 新建了一个*object monitor*对象  markword中放的就是这个 指针 (java中就是个地址或者是ID )
代码语言:txt
AI代码解释
复制
 重量级锁,都在一个队列里等着,比较不消耗CPU资源 
代码语言:txt
AI代码解释
复制
可重入锁: 重量级是记录再object moniter 的某个属性上 
代码语言:txt
AI代码解释
复制
什么时候自旋上升为重量级锁: 
代码语言:txt
AI代码解释
复制
1.  自旋次数超过10次  或者 自旋的线程数超过CPU的一半   	2.  jdk1.6之前 -XX:PreBlockSpin可以调整 自旋超过多少次升级 
 	3.  jdk1.6之后加入了自适应 Adapative Self Sping  JVM自己个儿控制 

11:GC回收标记


01: 再看倒数第三位

001:无锁

101:偏向锁 放线程ID , c++实现是用的指针

3. synchronized 编译成字节码 会有两个单词 monitorenter monitorexit

什么时候monitorexit呢 , 代码执行完 ,或者是异常发生 这就是synchronized 自动释放锁的原理

4. 为什么有自旋锁还需要重量级锁

(1) 自旋是消耗CPU资源的,如果锁的时间长,或者自旋线程多,CPU会被大量消耗

(2) 重量级锁有等待队列,所有拿不到锁的进入等待队列,不需要消耗CPU资源

5. 偏向锁是否一定比自旋锁效率高?

(1)不一定 当你知道肯定存在多线程竞争的时候,偏向锁会涉及锁撤销,这时候自旋锁会比较好一点

(2) JVM启动过程就会很很多线程竞争,所以默认不开启偏向锁,过一段时间才会开启

(3) -XX:BiasedLockingStartupDelay = 0 默认是 4 秒

最后附上自己的微信公众号 刚开始做 愿一起进步:

公众号二维码.jpg
公众号二维码.jpg

注意: 以上文字 仅代表个人观点,仅供参考,如有问题还请指出,立即马上连滚带爬的从被窝里出来改正。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
从CPU冒烟到丝滑体验:算法SRE性能优化实战全揭秘|得物技术
其中,性能尤为关键——它既能提升系统稳定性,又能降低成本、优化效果。因此,工程团队将微秒级的性能优化作为核心攻坚方向。
得物技术
2025/06/09
1220
从CPU冒烟到丝滑体验:算法SRE性能优化实战全揭秘|得物技术
SRS:流媒体服务器如何实现负载均衡
 点击上方“LiveVideoStack”关注我们 作者:Winlin、Azusachino、Benjamin 编辑:Alex ▲扫描图中二维码或点击阅读原文▲ 了解音视频技术大会更多信息 ---- 当我们的业务超过单台流媒体服务器的承受能力,就会遇到负载均衡问题,一般我们会在集群中提供这种能力,但实际上集群并非是唯一的实现方式。有时候负载均衡还会和服务发现等时髦词汇联系起来,而云服务的LoadBalancer无疑不可回避,因此,这个问题其实相当复杂,以至于大家会在多个场合询问这个问题,我打算系统地阐述
LiveVideoStack
2022/05/25
2K0
SRS:流媒体服务器如何实现负载均衡
下一代 TGW 从13Mpps到50Mpps性能优化之旅
本文作者:和广强,腾讯 TEG 后台开发工程师 0 导语 性能优化是一条既充满挑战又充满魔力的道路,非常幸运如今基于 X86 的性能优化方法及工具已经比较成熟,在 TGW 产品架构即将变革之际,我们结合 X86 常用的性能优化方法与工具,深入分析 DPDK 版本 TGW 转发架构与流程将 TGW 转发性能从 13Mpps 优化到 50Mpps;本文带你穿越下一代 TGW 性能优化之旅,快上车吧。 1 前言 目前腾讯突破“双百”里程碑(服务器超过 100W 台,带宽峰值超过 100T)其所承载的业务
腾讯技术工程官方号
2019/12/18
1.8K0
下一代 TGW 从13Mpps到50Mpps性能优化之旅
SRS5优化:如何将DVR性能提升一倍
Written by 王磊(bluestn). Summary SRS支持将直播录制为VoD文件,在压测时,如果流路数很多,会出现CPU消耗很多的问题。 原因是写入较小视频包时,SRS使用了write,由于没有缓冲能力,导致频繁的系统调用和磁盘繁忙。 优化方案,可以选择fwrite(v5.0.133+),或者老版本用内存盘方案,可将DVR性能提升一倍以上。 Environments SRS服务器配置如下: • CPU:INTEL Xeon 4110 双路16和32线程 • 内存:32G • 网卡:10Gb
Winlin
2023/01/09
1.4K0
SRS5优化:如何将DVR性能提升一倍
国产开源流媒体SRS4.0对视频监控GB28181的支持
1. SRS最大的特点就是简单,表现在代码架构简单,实现简单,部署简单,运维简单;
潇湘落木
2020/11/12
8.1K1
国产开源流媒体SRS4.0对视频监控GB28181的支持
SRS5第一大炮:如何实现SRT协程化
Coroutine Native SRT Written by John[1], Winlin[2] 协程是现代服务器的核心技术,能极大简化逻辑和提升维护性;SRT是逐渐在取代RTMP推流的新协议,但它有自己的IO框架;只有实现了SRT的协程化,才能成为SRS的核心的成熟的协议,这是SRS 5.0迈出的第一步,也是至关重要的一步。 SRS 5.0从2022年初启动以来,经过摸索和探讨,确定了以媒体网关作为核心方向,详细请看SRS 5.0核心问题定义和解法。 SRT作为主播/广播推流领域广泛采用的协议,浏览器
Winlin
2022/07/04
8980
SRS5第一大炮:如何实现SRT协程化
比nginx-rtmp高三倍性能的SRS的高性能是个什么球?
SRS单进程能支持9000并发,nginx-rtmp单进程最多支持3000个,单进程的性能SRS是nginx-rtmp的三倍。SRS单进程性能如何做到nginx-rtmp的三倍的?SRS哪几个结构极大提升了性能? 先来看看我们遇到的问题,RTMP协议和HTTP协议是又很大不同的。nginx在分发HLS,即m3u8文本文件和ts视频文件时,对所有连接发送的都是同一个内容,甚至可以调用sendfile让内核自己发fd去,nginx服务器自己要干的事情很少了;如果nginx必须把每个ts的内容读出来,修改里面某些
Winlin
2022/03/18
8130
Hi, SRS 5.0!
随着志宏大神合并完DASH的功能,SRS 5.0正式完成功能,进入一年左右的稳定性提升阶段,预计在2023年底正式发布,现在已经可以开始体验SRS 5.0的Alpha版本了。 SRS 5.0 Alpha 0 Features 下面是5.0新增的功能列表: •  优化SRT,支持协程原生架构。#3010[1] •  支持amd/armv7/aarch64多CPU架构的Docker镜像。#3058[2] •  Forward增强,支持动态Forward,可以灵活定制转发策略。#2799[3] •  GB281
Winlin
2022/11/28
1.8K0
Hi, SRS 5.0!
重磅:SRS 5.0正式支持GB28181
支持GB28181是正确的事情,可能也是困难的事情,因为困难所以有趣。 Introduction 在非常多朋友的努力下,SRS的GB功能不少,详细可以参考srs-gb28181[1]。由于GB和摄像头的复杂性,问题也是不少的,特别是稳定性问题,这也是为什么GB一直迟迟没有进SRS 5.0分支的原因。 现在SRS 5.0已经临近功能封版了,我们增加了几个大的功能和改进,最后一个功能就是在考虑是否支持GB。鉴于GB目前的稳定性表现,肯定不能完全合并过来,是否能有稳定性更高的合并办法? 如果减少功能,当然稳定性就
Winlin
2022/10/09
4.3K0
重磅:SRS 5.0正式支持GB28181
SRS、EasyDarwin、ZLMediaKit、Monibuca对比分析
目前市面上有很多开源的流媒体服务器解决方案,常见的有SRS、EasyDarwin、ZLMediaKit和Monibuca等,我们应该怎么选择呢?
liuzhen007
2021/02/06
28.8K1
SRS:如何用NGINX搭建HLS分发集群
SRS的集群,终于补齐了最后一块拼图,就是基于NGINX的HTTP文件分发集群,比如HLS分发集群。 并且,HLS分发集群,可以和HTTP-FLV一起工作。高并发,高扩展性的NGINX,YYDS。 边缘集群(Edge Cluster)就是为了解决很多人观看的问题,可以支持非常多的人观看直播流。注意: •SRS Edge只支持直播流协议,比如RTMP或HTTP-FLV等,参考RTMP Edge Cluster[1]。•SRS Edge不支持HLS或DASH等切片的直播流,本质上它们不是流,就是文件分发。•SR
Winlin
2022/04/06
2.5K0
SRS:如何用NGINX搭建HLS分发集群
​Linux CPU 性能优化指南
本文作者:allenxguo,腾讯 QQ 音乐后台开发工程师 本文主要帮助理解 CPU 相关的性能指标,常见的 CPU 性能问题以及解决方案梳理。 系统平均负载 简介 系统平均负载:是处于可运行或不可中断状态的平均进程数。 可运行进程:使用 CPU 或等待使用 CPU 的进程 不可中断状态进程:正在等待某些 IO 访问,一般是和硬件交互,不可被打断(不可被打断的原因是为了保护系统数据一致,防止数据读取错误) 查看系统平均负载 首先top命令查看进程运行状态,如下: PID USER
腾讯技术工程官方号
2020/08/11
8.8K0
服务器性能优化的正确姿势(好文推荐)
导言:运维工作中除了要维持平台的稳定运行以外,还得对服务器的性能进行优化,让服务器发挥出良好的工作性能是稳定运行的基础。腾讯互娱DBA团队的汪伟(simon)在这一领域里整理出了一套性能优化的资料为大家在性能优化提供充足的方向。
Spark学习技巧
2019/05/16
2.8K0
服务器性能优化的正确姿势(好文推荐)
CPU性能优化干货总结
部门成立专项组,对数智平台和站务系统做性能优化,其中目标之一为降低服务端硬件成本,即在32G内存、CPU银牌的配置下,能支撑1万+发客量。要达到此目标,需通过压力测试并配合监控系统,以QPS、RPS、接口响应时间、接口成功率、SQL耗时、JVM运行情况、CPU和内存运行情况等数据指标为依据,找出系统中存在的性能瓶颈。
夕阳也是醉了
2023/10/16
5200
CPU性能优化干货总结
SRS: Cloud Native改进知多少
前段时间推送了SRS遇到K8S系列,现在SRS3已经提供了完整的K8S+Docker支持,SRS正式走进Could Native时代,这意味着更便捷的部署、更高的弹性、更快的扩容和缩容、无中断服务的发布和灰度能力。 这篇文章,让我们一起看看SRS,以及一个应用,要达到弹性能力需要做出多少关键的改变吧(更详细的说明可以点阅读原文链接哦)。 Daemon Daemon就是后台启动服务的意思,一般使用安装包和二进制部署时,都要求程序实现daemon启动的功能,这样可以防止退出terminal时进程也退出。比如N
Winlin
2022/03/18
8760
带你重走 TiDB TPS 提升 1000 倍的性能优化之旅
今天我们来聊一下数据库的性能优化,第一部分简单介绍一下性能优化的通用的方法,第二部分我们讲一个实际案例。
PingCAP
2021/12/07
1K0
腾讯云音视频与SRS开源生态
自由与开源软件的理念,从不解、争议、接受到如今如火如荼,经历了长期的历程。国内开源软件起步较晚,但进展迅速。腾讯经过几年的开源协同运动,也取得了不少成绩。其中,腾讯云音视频在FFmpeg、SRS等重要多媒体开源社区的贡献,颇具代表性。 SRS是开源实时视频服务器、全球流服务器中Star最多也最活跃的开源项目,主要应用在直播、WebRTC、安防和交通等领域,支持常用的流媒体协议和转换,以好用易用赢得了全球开发者的良好口碑。开箱即用的云SRS开源音视频方案赋能众多行业创造了新的可能。同时,SRS由工信部木兰开源
腾讯云音视频
2023/04/11
2.2K0
腾讯云音视频与SRS开源生态
【性能优化方法论系列】三、性能优化的核心思想(2)
CPU 缓存、浏览器缓存、CDN 缓存、DNS 缓存、内存缓存、 Redis 缓存等,它们都是将数据缓存在离使用者更近的地方,或者读取速度更快的存储介质中,通过空间换时间的方式实现性能优化的。
明明如月学长
2022/07/12
4300
【性能优化方法论系列】三、性能优化的核心思想(2)
Linux性能优化指北大全
性能问题的本质就是系统资源已经到达瓶颈,但请求的处理还不够快,无法支撑更多的请求。性能分析实际上就是找出应用或系统的瓶颈,设法去避免或缓解它们。
入门笔记
2022/06/03
1.1K0
Linux性能优化指北大全
Ceph 架构及性能优化
ceph-mon和ceph-mds需要2G内存,每个ceph-osd进程需要1G内存。
肉眼品世界
2021/04/20
9010
相关推荐
从CPU冒烟到丝滑体验:算法SRE性能优化实战全揭秘|得物技术
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档