精华内容
下载资源
问答
  • 这里特别注意一点有些朋友说运行start的方法就表示线程已经运行了,这其实你在测试的时候看到的程序确实是这样但是在线程生命周期中,运行start方法只是代表了这个线程具备了抢夺CPU时间片的权利。线程其实并没有...

    在这里插入图片描述
    开始先放一张图吧,这个图是我手动画的网上也有很多,描述线程的生命周期状态图。
    1、线程的新建状态 : 你简单点就是new Thread的吧。
    2、就绪状态:只运行start()方法。这里特别注意一点有些朋友说运行start的方法就表示线程已经运行了,这其实你在做测试的时候看到的程序确实是这样但是在线程生命周期中,运行start方法只是代表了这个线程具备了抢夺CPU时间片的权利。线程其实并没有处于运行状态。
    3、运行状态:运行状态的开启表示是执行了run方法。我们创建线程的两种方式 extends Thread 或者 implements Runnable 接口的方式都是必须重写run方法。
    4、阻塞状态: 阻塞状态的线程会放弃掉之前抢夺的CPU时间片。等到阻塞时间结束后由于处于就绪状态重新抢夺CPU时间片。
    5、锁池:最常见的就是synchorized关键字。我们都知道有时候在处理多线程并发访问数据库导致数据库压力比较大的的问题时候最常见的有双重锁的方式。这种方式就是保证了每次只有一个线程通过去查询redis缓存这种Nosql数据库。找不到的话就去mysql/Oracle数据库中查询并且将查询结果存到到redis缓存中。这样保证在这条线程执行完成之后其它线程来访问的时候一定是取redis中查询的。依次来减轻服务器的压力。

    那么关于多线程的编程优势我在这儿就不重复啰嗦了无非就是提高程序的执行效率,同时多线程也带来了一些线程安全问题,这是我们在开发多线程编写多线程代码的时候必须考虑的问题。那么多线程的问题造成的主要因素到底有哪些。

    一、线程安全与不安全的问题

    那么一谈到线程安全的问题就是说我们多个线程在操作同一个对象的实例变量时,会出现值被修改而没有同步的问题。

    1、线程的原子性问题

    原子就是最小粒度。知道mysql的事物ACID的人都知道事务也是具有原子性。但是我们要说的是线程的原子性。当一个线程访问一个共享变量的操作在其他线程开来;这个操作要么已经执行完毕要某执行尚未发生,其他线程是看不到中间的执行结果的。
    还有一点就是 访问同一组共享变量的原子操作时不可交替。

    Java中有两种实现原子性的操作,一种是加锁常见的synchronized同步锁,Look对象锁。这种就不用不用解释了,就是上厕所你把们关上别人进不去只能等你上完了你再进去呗。

    给大家写了一段代码测试原子性问题:

    /**
     * Description: 测试线程安全原子性的问题
     *
     * @author: 德鑫
     * @since: 2020/09/23
     */
    
    public class Test01 {
    
        public static void main(String[] args) {
            MyInt myInt = new MyInt();
            for (int i = 0; i < 2; i++) {
                new Thread(new Runnable(){
    
                    @Override
                    public void run() {
                        while (true){
                            System.out.println(Thread.currentThread().getName() + "  === " + myInt.getNum());
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }).start();
            }
        }
        static class MyInt{
            int num;
            int getNum(){
                return num++;
            }
        }
    
    }
    

    2、可见性

    在多线程环境中,一个线程对某个共享变量进行更新后。后续其它的线程可能无法立即读到这个更新的结果。随之带来的还有可能是其它线程读取到脏数据的问题。

    给大家写了一段代码可以运行看看线程可见性

    /**
     * Description: 测试线程安全可见性的问题
     *
     * @author: 德鑫
     * @since: 2020/09/23
     */
    
    public class Test02 {
        public static void main(String[] args) throws InterruptedException {
            MyTask myTask = new MyTask();
    
            new Thread(myTask).start();
            Thread.sleep(1000);
            myTask.cancel();
        }
    
        static class MyTask implements Runnable{
            private boolean toCancel = false;
    
            @Override
            public void run() {
                while (!toCancel){
                    if(doSpmething()){
                        break;
                    }
                }
                if(toCancel){
                    System.out.println("取消");
                }else{
                    System.out.println("结束");
                }
            }
    
            private boolean doSpmething() {
                System.out.println("执行某个任务");
                try {
                    Thread.sleep(new Random().nextInt(1000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return false;
            }
    
            public void cancel() {
    
                toCancel = true;
                System.out.println("收到取消线程");
            }
        }
    }
    

    2、有序性

    有序性是指在在什么情况下一个处理器上运行的一个线 程所执行的 内存访问操作在另外一个处理器运行的其他线程看来是乱序。
    其实说起这个有序性涉及到的指令重排序出发点是好的。对于单线程来讲指令重排序的作用可以大大提高程序的执行效率。并且不影响程序的最终结果

    那么对于多核CPU来讲。由于编辑器可能改变了程序的执行结果导致最终结果出现不可预测的问题。

    重排序与可见性的问题不是必然出现的,依赖于及时编译器(JIT)的环境配置和。

    存储子系统重排序 我暂时不想写 看到的朋友可以留言给我我会在后面认真细致的总结出来。

    二、串行语义

    JIT 编译器,处理器,存储子系统是按照一定的规则对指令,内存操作 的结果进行重排序, 给单线程程序造成一种假象----指令是按照源码 的顺序执行的.这种假象称为貌似串行语义. 并不能保证多线程环境 程序的正确性。

    那么上面提到指令重排序给我们程序运行结果的造成了一次不可预期的结果,但是如果两个指令之间出现数据依赖关系那么就不会出现重排序的情况。
    【例如:】
    x= 1 ;
    y=x+2;
    这两天语句明显说的就是把x 的值参与到y的表达式计算得出y = 3;
    如果发生重排序则导致执行结果出错。
    可能出现重排序的情况:
    【例如:】
    double price = 1.35;
    int quantity = 30;
    double sum = price * quantity;
    这种情况就导致了 price变量和quantity 变量在定义的时候可以重排序。

    还有例如存在控制依赖关系的语句运行重排。很多时候我们if条件语句块中的代码块可能编辑器会先执行在判断if的条件是否成立。

    特别在对于JDK14的发布我们在调试程序时IDEA现在非常的智能可以对我们的结果进行预测。很大程度上使用到了这种重排序的功能优先知道某个变得的预期值。

    --------------------------------end

    好了! 线程专题第二部分关于线程的生命周期和线程安全问题的因素都说清楚了。后面第三专题我准备聊一下Java内存模型以及线程栈问题。

    展开全文
  • 这些年来,我都怀疑,我们是不是天生就是人格分裂者,嘴上说的基本上和的对不上号。人与人之间缺少基本的信任,当然经验告诉我们也没法信任。我也发现上层在有意无意引导这种趋势(对于他们来说,老百姓的...

    道德的口号天天在喊,但这些都是喊给别人,喊给老百姓的。这些年来,我都怀疑,我们是不是天生就是人格分裂者,嘴上说的基本上和手上做的对不上号。人与人之间缺少最基本的信任,当然经验告诉我们也没法信任。我也发现上层在有意无意引导这种趋势(对于他们来说,老百姓的这种状态从管理角度来说是最有利的态势)。人与人之间的这种关系反映在各个层面,虽然物质上不算很差(虽然,吃的,用的假冒伪劣比较多),除了那些真的没有一点人性的人,其实大家都活的很累。

    难道如此才能强大?

     

    展开全文
  • title: 自己动手实现操作系统 写在前面 一开始有这样的想法是因为偶然在知乎上看到一个动态,此处@VictorYXL...我打算今天开始慢慢,每天完成一些工作,并通过博客更新的方式记录下来。当作激励自己的手段。当然.

    写在前面

    一开始有这样的想法是因为偶然在知乎上看到一个动态,此处@VictorYXL大佬,该大佬完整地实现了一个基础的操作系统。我想我也能模仿一下。奈何我有拖延症,此事一拖就拖到了现在。

    为什么要自己动手实现操作系统

    就我个人来讲,我是一个好奇心较重的人,对于操作系统这种特别底层的东西很是感兴趣。所以就想了解透彻。学习一个东西最好的方式就是自己动手完整的做一遍。

    计划及期望

    我打算从今天开始慢慢做,每天完成一些工作,并通过博客更新的方式记录下来。当作激励自己的手段。当然这篇序言也会不断地更新。

    展开全文
  • 分布式开发,需要懂哪些技术?

    千次阅读 热门讨论 2020-10-08 15:39:19
    再看看Java虽是不温不火,却仍然是应用广泛的开发语言,传统行业到通信和金融、再到移动互联网、支付和电商等;在各种技术框架下,仍然用着Java作为第一开发语言。今天,想分布式开发,需要掌握的技术知识点

    阅读建议文章多处链接别处详细文章,客观莫急建议先把文章总体阅读完毕后,再点进去慢慢品味具体细节点。


    一、前言

    私底下问了几位前同事,还有不少同行的大学同学,几乎他们公司都在用目前主流的分布式技术框架做开发。还记得几年前刚毕业那会,.net和php做各种企业管理系统和网站还很吃香,智能机普及安卓和ios客户端开发大势流行更胜一筹;硬件方面C作为底层开发的鼻祖,网游和手游风靡之下C++作为主流游戏服务端语言;再看看Java虽是不温不火,却仍然是应用最广泛的开发语言,从传统行业到通信和金融、再到移动互联网、支付和电商等;在各种技术框架下,仍然用着Java作为第一开发语言。今天,想做分布式开发,需要掌握的技术知识点也是非常得多。如果你所在的公司正在往分布式技术栈迁移,或者你自己有往这方面学习和深入的打算,而又有点迷茫不知从何学期。那么,接下来就让我们一起来看看,想做分布式开发,到底需要学会哪些技术?

    二、分布式篇

    首先,我们从整体的架构开始进行一个初步的认识。我们先来思考以下几个问题,从各个层面来一一剖析分布式技术框架,让你全面了解分布式框架知识。

    1 这个技术框架,它是什么东西?

    对于还没接触和了解过分布式框架的朋友,这个问题是你要关注的。你要学习一个东西总得先学习和了解它吧。详细查看博主另一篇文章,非常详细和形象的表述了单体式架构和分布式框架的区别,以类比法让你不仅掌握了分布式框架知识,而且还能同时比较单体式架构跟分布式架构的区别:单体架构,分布式系统的差别在哪里?

    2 这个技术框架,它为解决了什么问题或痛点?

    传统的单体式架构,存在团队合作困难。每次需求迭代和修改,即使是修改一行代码,也将涉及到整个系统的打包部署。不仅给开发和测试带来更多额外工作,也给运营带来困扰需要停机维护。另一个,从系统层面上来讲。单体式架构系统代码臃肿,高内聚高耦合应对高并发时有明显的系统性能缺陷,需要依赖机器服务集群部署来弥补软件性能的劣势。这时,分布式就应运而生了,它有着明显的优势:高内聚、低耦合,团队协作,各个业务模块独立开发测试和部署;完全避免和解决了单体式架构的缺陷与问题。这篇文章也有详细说明:分布式框架解决了什么问题?

    3 有哪些分布式框架技术?

    目前主流的分布式技术除了SpringBoot/Cloud、Dubbo外,像腾讯的Tars,京东的JSF,新浪的Motan等;SpringBoot/Cloud是国际性应用最广发的分布式框架技术,而国内也有很多互联网公司使用国产的Dubbo和Motan框架;Dubbo是阿里巴巴开源的一个RPC(远程过程调用)架构,Motan是新浪开源的轻量级RPC框架。

    4 掌握这个技术框架,需要学会哪些(多少)技术?

    要学习分布式技术框架,除了需要有坚实的Java基础外,还得掌握很多分布式组件知识。接下来就把本文的重点奉献给大家:
    4.1 分布式服务框架

    主要分为HTTP和RPC两种类型,面向服务架构SOA,它是一种建设企业生态系统的架构指导思想。SOA的关注点是服务,服务最基本的业务功能是单元,由平台中立性的接口契约来定义。通过将业务系统服务化、不同模块解耦、各模块间互相调用、消息交换和资源共享。

    主流的分布式/微服务架构:SpringBoot/Cloud、Dubbo、Tars、JSF、Motan等。

    4.2 分布式事务

    事物的4个基本特性:原子性、一致性、隔离性和持久性。

    CAP原则和BASE理论,详细见博文:分布式CAP理论和BASE理论

    XA协议通过2PC两阶段提交,三阶段提交3PC解决方案。

    TCC模式(Try、Confirm、Cancle)最终一致性分布式事务的实现方案:谈谈分布式事务TCC机制

    补偿模式如重试机制达到最终一致性。

    可靠事件模式通过异步处理、系统解耦、流量削峰等:消息中间件MQ系列

    开源方案有:tcc-tranction、Elastic-Job、ShardingSphere、seata、MQ。

    4.3 分布式锁

    • 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行。
    • 高可用的获取锁与释放锁
    • 高性能的获取锁与释放锁
    • 具备可重入特性(可理解为重新进入,由多于一个任务并发使用,而不必担心数据错误)
    • 具备锁失效机制,防止死锁
    • 具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败

    经典方案:基于zookeeper或者redis实现分布式锁。

    4.4 分布式缓存

    分布式缓存是为了解决web服务器与数据库服务器之间的瓶颈,如果访问流量大,那么这个瓶颈就越大。数据库的读取压力将会非常大,即使此时数据库已经做了读写分离。那么为了分担数据库的压力,需要将数据缓存起来,这是可以在业务层,缓存数据。

    经典方案:redis、memcache 实现。

    4.5 分布式消息系统

    主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构(分布式事务)。

    经典方案:Kafka、ActiveMQ、RabbitMQ、RocketMQ (详见文章)消息中间件MQ系列   Zookeeper搭载kafka消息发布和订阅

    4.6 分布式搜索系统

    分布式的环境中,利用分布式计算和移动代理等技术从大量的、异构的信息资源中检索出对于用户有用的信息的过程。分布式环境指的是信息资源在物理上分布于不同的地点,在数据库结构上具有异构性,这些分散和异构的信息资源在逻辑上是一个整体,从而构成一个分布式检索系统。

    经典解决方案:Elasticsearch(基于Luence)

    4.7 分布式调度

    任务调度是指基于给定的时间点,给定的时间间隔或者给定执行次数自动的执行任务。任务调度是是操作系统的重要组成部分,而对于实时的操作系统,任务调度直接影响着操作系统的实时性能。任务调度涉及到多线程并发、运行时间规则定制及解析、线程池的维护等诸多方面的工作。

    分布式任务调度框架:cronsun、Elastic-job、saturn、lts、TBSchedule、xxl-job等

    4.8 配置中心

    随着业务的发展、微服务架构的升级,服务的数量、程序的配置日益增多(各种微服务、各种服务器地址、各种参数),传统的配置文件方式和数据库的方式已无法满足开发人员对配置管理的要求:

    • 安全性:配置跟随源代码保存在代码库中,容易造成配置泄漏。
    • 时效性:修改配置,需要重启服务才能生效。
    • 局限性:无法支持动态调整:例如日志开关、功能开关。

    常见分布式配置中心:Spring config 、Apollo 、nacos、Diamond、Disconf  (详见)SpringCloud-Config配置中心学习总结

    4.9 注册中心

    注册中心主要涉及到三大角色:

    1. 服务提供者
    2. 服务消费者
    3. 注册中心

    关系大致如下:

    • 各个微服务在启动时,将自己的网络地址等信息注册到注册中心,注册中心存储这些数据。

    • 服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口。

    • 各个微服务与注册中心使用一定机制(例如心跳)通信。如果注册中心与某微服务长时间无法通信,就会注销该实例。

    • 微服务网络地址发送变化(例如实例增加或IP变动等)时,会重新注册到注册中心。这样,服务消费者就无需人工修改提供者的网络地址了。

    主要解决方案:Zookeeper、Eureka、Nacos、Consul 

    4.10 分布式链路追踪

    分布式系统变得日趋复杂,越来越多的组件开始走向分布式化,如微服务、分布式数据库、分布式缓存等,使得后台服务构成了一种复杂的分布式网络。在服务能力提升的同时,复杂的网络结构也使问题定位更加困难。在一个请求在经过诸多服务过程中,出现了某一个调用失败的情况。

    分布式链路追踪就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。

    解决方案:Zipkin、Brave、Dapper、CAT、Mtrace等

    4.11 服务监控

    分布式系统复杂,需要有一个监控来将整个应用调用的全过程进行全天候监控,也能对系统资源、第三方组件进行监控,确保能够第一时间发现问题并及时解决问题。

    • web地址响应性能监控与统计
    • 服务响应新能监控与统计
    • RPC服务响应性能监控与统计
    • API接口响应性能监控与统计
    • 组件节点监控(MySQL、Redis、MQ)
    • 系统CPU、内存、硬件监控
    • 系统异常监控与统计

    解决方案:Zabbix、Nagios、Metrics、Spectator

    4.12 日志收集和分析

    集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,分布式日志手机解决更高的查询、排序和统计。

    主要组件:FileBeat + Kafka + ELK(Logstash)、Flume

    4.13 服务路由网关

    路由网关的角色是作为一个API架构,用来保护、增强和控制对于API服务的访问,它处于应用程序或服务之前的系统,用来管理授权、访问控制和流量限制等。

    四大路由网关:Zuul 2、SpringCLoud Gateway、Kong、OpenResty (详见文章)这些微服务网关你了解吗?

    4.14 服务熔断器

    复杂的分布式架构的应用程序有很多依赖,都会不可避免的出现服务故障等问题。高并发的依赖失败时,如果没有采取措施,当前应用服务就有被拖垮的风险。

    当下游服务因为访问压力过大或者其他原因导致影响变慢的时候,上游服务为了保护自己以及系统整体的可用性,可以暂时切断对下游服务的调用。

    解决方案:Hystrix、Envoy

    4.15 负载均衡

    一台服务器的处理能力,主要受限于服务器自身的可扩展硬件能力。所以,在需要处理大量用户请求的时候,通常都会引入负载均衡器,将多台普通服务器组成一个系统,来完成高并发的请求处理任务。

    我们通常说的负载均衡都是指web服务端负载均衡,但是涉及到分布式系统时,就不是简单的服务端负载均衡了,一般都需要在各个业务系统间维护一个客户端的负载均衡机制。

    服务端负载均衡:Nginx 、OpenResty

    客户端负载均衡:Ribbon和Feign 

    详见文章:Ribbon和Feign客户端负载均衡及服务调用

    三、总结

    分布式技术栈是一个复杂和庞大的体系,每一个知识点都博大精深,想要深入精髓达到精通的境界难度非常大。但我们只需要达到掌握其基本理论和一些常用技术点,用以解决日常工作中的问题就足够了。

    以上所有组件技术都收录在了公众号:SpringCloud微服务构建浅析

     


    既然都看完了整篇文章,相信对你一定有所帮助。原创不易,远离伸手党。

    点击下方【打赏】小编,或者关注公众号给予支持,你们的每一份鼓励都将是小编伟大的动力。


    同名原创公众号:  程序大视界
    展开全文
  • 要实现通过网口下载文件的功能,从底层到上层需要的工作包括:开发板上的网卡芯片的驱动程序;TCP/IP协议栈的实现;TFTP客户端应用程序的实现。我们使用的OK2440开发板配备CS8900A网卡芯片。 为了简单起见,网络...
  • 现在有一些IOS模拟器的产品,常听到的就是果仁模拟器、黑雷模拟器这些,但是产品级的角度上来看这些产品并不能够大规模市场化,简单的原因就是这些iOS的模拟器都只能支持少数几款产品,而且并不能保证帐号数据...
  • 小嘉投简历是7月12号开始的,大概投了十几家公司,早的是京东,不过没有给面试机会,后来了笔试,也没得到京东的面试。第一家面的是深信服,两面基本全问的网络,网络学的并不好,也就没后文了。笔试的话
  • 分页组件,项目不要写动手写代码,要想想业务逻辑,怎么写,如何写才是最好的呈现方式,项目不急,要先想好整体的框架,从底层一开始想要的是什么起。 先动代码,边边想是会出问题的,而且还会卡壳,让你...
  • 不过有很多读者还是质疑:现在软件编程主要领域是框架和应用,还需要了解操作系统底层吗? 经过四年的磨练成长,于渊又拿出第二版的书稿《Orange'S:一个操作系统的实现》,这本书是属于真正 Hacker的。我虽然已经...
  • 不过有很多读者还是质疑:现在软件编程主要领域是框架和应用,还需要了解操作系统底层吗? 经过四年的磨练成长,于渊又拿出第二版的书稿《Orange'S:一个操作系统的实现》,这本书是属于真正 Hacker的。我虽然已经...
  • 为了让前面练习的成果,在实际应用中产生价值,在这部分我们补充更多的理论知识并尝试用它们去一点什么。这一部分包括指令分析、硬件基础知识、内核Hook的实际开发练习,以及将完成一个用到内核Hook的有趣的实例,...
  • b) 切面是spring的特色了,可以实现外加业务而无需对源码更改,让人很省心,当然优秀的框架自然更加整合度更高,不至于让人从底层逻辑开始开发,而忽略业务逻辑,对于事务控制还需要整合更多. c) 声明式事...
  • 分页组件,项目不要写动手写代码,要想想业务逻辑,怎么写,如何写才是最好的呈现方式,项目不急,要先想好整体的框架,从底层一开始想要的是什么起。 先动代码,边边想是会出问题的,而且还会卡壳,让你...
  • 最好可以结合guzzle代码分析回答socket 就是最底层的 Socket 通信, 如果要访问 HTTP, 你得完全手写, 这是非常底层的方式, 除非你有特殊需要, 不然不建议这么. 所以这个可以先排除在外.curl 实际上是一个命令行界面...
  • | Jeskson来源 | 达达前端小酒馆分页组件首先来创建项目:分页组件,项目不要写动手写代码,要想想业务逻辑,怎么写,如何写才是最好的呈现方式,项目不急,要先想好整体的框架,从底层一开始想要的是什么起...
  • | Jeskson来源 | 达达前端小酒馆分页组件首先来创建项目:分页组件,项目不要写动手写代码,要想想业务逻辑,怎么写,如何写才是最好的呈现方式,项目不急,要先想好整体的框架,从底层一开始想要的是什么起...
  • | Jeskson来源 | 达达前端小酒馆首先来创建项目:分页组件,项目不要写动手写代码,要想想业务逻辑,怎么写,如何写才是最好的呈现方式,项目不急,要先想好整体的框架,从底层一开始想要的是什么起。...
  • Funtoo 安装 (一)

    2013-06-06 19:42:16
    参考官方资料。... ...已经弄了一天多了,还...1.funtoo(以及gentoo)的安装难度比较大,需要手动从最底层的创建文件系统、下载编译内核起; 2.对Stage 3、portage tree、内核源代码等概念不清楚,对grub的
  • 对Java开发的知识点进行深入的学习,并打算成系列,先基础常用的重点**(面试点)**知识开始,后续会陆续扩展,加油! 涉及到底层的可能代码块会多点,但要学习底层不看代码看啥?代码说明一切!!!放心,基本上...
  • 本教程将给大家深度剖析数据库框架底层实现的原理,然后采用泛型、反射、注解机制来教大家一个自己的数据库框架。 前面学习了很多教程,我们转换了一下风格,开始一个点切入,更加深入的提升,这也是符合人的...
  • 一个C语言程序源代码变为最后的可执行...而且现在的编译器一般是一步到位,这样虽然节约了时间,却不利于新手们从底层开始学习C语言。 在这篇文章中,大家可以通过自己动手实践,逐步地理解、感受c语言的编译过程。

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 167
精华内容 66
关键字:

从最底层做手