1. 进程和线程的区别

    1. 操作系统以进程为单位,分配 cpu 资源,进程是资源分配的最小单位
    2. 线程是轻量级进程,是操作系统调度执行的最小单位
    3. 线程可以共享进程内资源,进程资源是独立的
    4. 进程间通信
      • 管道
      • 信号
      • 消息队列
      • 共享内存
      • 信号量
      • 套接字
阅读全文 »

Callable 实现原理

Callable 接口按照 Runnable 方式写作一个可带返回参数的接口,即 call()参照 run()。

阅读全文 »

引用与导出

消费者引入,服务者导出

导出

3.0 版本之前

  1. 识别 @DubboService 注解
  2. 寻找 ServiceConfig
  3. 调用 export() 方法
  4. 确定使用协议
  5. 生成对应的 url(tri://ip:port/接口名?k1=v1)
  6. 启动对应通信框架
  7. 注册到注册中心
阅读全文 »

和 cloud 区别

  • dubbo 存入的是接口名:url,cloud 存入的是应用: url,这样 dubbo 存入的数据量会多很多
  • dubbo 改变会很频繁,cloud 存入的应用级的所以不关心单个接口更新
  • dubbo3.0 也转换为应用级注册,也方便去调用 cloud 服务
  • springcloud 因为只保存应用,如果调用 rest 接口,消费者需要配置 url 路径
阅读全文 »

提供者

  1. 本地注册

    将自己需要暴露出去的类做一个注册,放入map集合中

  2. 绑定ip地址,启动 tomcat,创建 HttpServer,等待请求

  3. 消费者调用,使用 req,response

阅读全文 »

1. 加载顺序

jvm 加载顺序为加载,验证,准备,解析,初始化,使用,卸载

1
2
3
4
5
6
7
class testLoad {
static int a = 66;

public String toString() {
return "1111";
}
}
阅读全文 »

终止线程

如何在线程 1 中终止线程 2?

  1. 使用 stop,不能确保线程 2 完整结束
  2. System.exit(int),会终止整个程序
  3. 使用中断机制
阅读全文 »

java 创建对象流程

  1. 类加载器加载

    这个时候会通过双亲委派机制,检查自己是否加载过此类,如果没有,则通过 parent 属性调用父级类加载器检查是否加载过此类,如
    parent 属性中为 null

    则调用 BootStrap 类加载器检查是否加载,若未加载此类,如果尝试加载,若加载失败,则传递给下一级类加载器加载

阅读全文 »

1. 原子性

即保证操作不可中断,只能执行或者不能执行

在 java 中只有简单的赋值和读取是原子性操作,而对于复杂业务而言,这需要使用 synchronized 和 Lock
来实现,因为同一时段只能保证一个线程操作,就不会有原子性问题

阅读全文 »