(线程)学习笔记

1.调用Thread.sleep():使当前线程睡眠至少多少毫秒(尽管它可能在指定的时间之前被中断)

2.调用Thread.yield():不能保障太多事情,尽管通常它会让当前运行线程回到可运行性状态,使得有相同优先级的线程有机会执行。

3.调用join()方法:保证当前线程停止执行,直到该线程所加入的线程完成为止。然而,如果它加入的线程没有存活,则当前线程不需要停止。

为什么要有线程同步?

线程的同步是为了防止多个线程访问一个数据对象时,对数据造成破坏。

线程的同步与锁

java中每个对象都有一个内置锁,当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁。获得一个对象的锁也称为获取锁,锁定对象、在对象上锁定或在对象上同步。

当程序运行到synchronized同步方法或代码块时该对像锁才起作用。一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放。释放锁是指持锁线程退出了synchronized同步方法或代码块。

线程同步总结

1、线程同步的目的是为了保护多个线程访问一个资源时对资源的破坏。

2、线程同步方法是通过锁来实现,每个对象都有且仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对象的线程就无法再访问该对象的其他同步方法。

3、对于静态同步方法,锁是针对这个类的,锁对象是该类的Class对象。静态和非静态方法的锁互不干预。一个线程获得锁,当在一个同步方法中访问另外对象上的同步方法时,会获取这两个对象锁。

4、对于同步,要时刻清醒在哪个对象上同步,这是关键。

5、编写线程安全的类,需要时刻注意对多个线程竞争访问资源的逻辑和安全做出正确的判断,对于"原子"操作做出分析,并保证原子操作期间别的线程无法访问竞争资源。

6、当多个线程等待一个对象锁时,没有获取到锁的线程将发生阻塞。

7、死锁是线程间相互等待锁造成的,当两个线程被阻塞,每个线程在等待另一个线程时就发生死锁。

   两种线程实现比较方式

ThreadRunnable
继承实现接口
重写run()方法实现run()方法
创建该子类的对象创建Runnable接口实现类的对象
用start()方法启动线程用start()方法启动线程

不能在继承其他类,可以直接操作线程

this.currentThread()

可以继承其他类,使用Runnable接口时,若要在run()方法中操作线程,必须使用Thread.currentThread()方法

start():线程调用该方法将启动线程,使之从新建状态进入就绪状态队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了。

run():线程对象被调度之后所执行的操作,由系统自动调用,用户程序不得引用。系统的Thread类中,run()方法没有具体内容,所以用户程序需要创建自己的Thread类的子类,并重写run()方法来覆盖原来的run()方法。当run()方法执行完毕,线程就变成死亡状态。

sleep(int millsecond):线程占有CPU期间,执行sleep方法来使自己放弃CPU资源,休眠一段时间。如果线程在休眠时被打断,JVM就抛出InterruptedException异常。因此,必须在try-catch语句块中调用sleep方法。

isAlive():判断一个线程是否存活,线程处于运行状态时,isAlive()方法返回true,否则返回false。注意:一个已经运行的线程在没有进入死亡状态时,不要再给线程分配实体。

currentThread():得到当前线程,是Thread类中的类方法,可以用类名调用,该方法返回当前正在使用CPU资源的线程。

interrupt():用来"唤醒"休眠的线程。

在并发编程中,线程之间如何通信(线程之间以何种机制来交换信息)及线程之间如何同步?

A:共享内存和消息传递

共享内存:在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。

消息传递:在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。

什么是同步?

A:同步是指程序用于控制不同线程之间操作发生相对顺序的机制。在共享内存并发模型里,同步是显示进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。在消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。

java的并发采用的是共享内存模型,java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。

java内存模型

在java中,所有实例域、静态域和数组元素存储在堆内存中,堆内存在线程之间共享。局部变量、方法定义参数和异常处理器参数不会在线程之间共享,它们不会有内存可见性问题,也不受内存模型的影响。

实例域:需要实例后方可使用里面的属性、方法。

静态域:不需要实例可以直接使用里面的属性、方法。

并发编程要处理两个关键问题:通信和同步。

- 共享内存模型:显式同步,隐式通信。

- 消息传递模型:显式通信,隐式同步。

由于java的并发采用共享内存模型,所以java线程之间的通信是隐式进行的。

线程常见问题

1、线程的名字,一个运行中的线程总是有名字的,名字有两个来源,一个是虚拟机自己给的名字,一个是你自己的定的名字。在没有指定线程名字的情况下,虚拟机总会为线程指定名字、并且主线程的名字总是main、非主线程的名字不确定。

2、线程都可以设置名字,也可以获取线程的名字,连主线程也不例外。

3、获取当前线程的对象的方法是:Thread.currentThread();

4、调用start()方法后只能保证:每个线程都将启动,每个线程都将运行直到完成。一系列线程以某种顺序启动并不意味着将按该顺序执行。对于任何一组启动的线程来说,调度程序不能保证其执行次序,持续时间也无法保证。

5、当线程目标run()方法结束时该线程完成。

6、一旦线程启动,它就永远不能再重写启动。只有一个新的线程可以被启动,并且只能一次。一个可运行的线程或死线程可以被重新启动。

7、线程的调度是JVM的一部分,在一个CPU的机器上,实际上一次只能运行一个线程,一次只有一个线程栈执行。JVM线程调度程序决定实际运行哪个处于可运行状态的线程。众多可运行线程中的某一个会被选中当做为当前线程。可运行线程被选择运行的顺序是没有保障的。

8、尽管通常采用队列形式,但这是没有保障的。队列形式是指当一个线程完成"一轮"时,它移到可运行队列的尾部等待,直到它最终排队到该队列的前端为止,它才能被再次选中。事实上,我们把它称为可运行池而不是一个可运行队列,目的是帮助认识线程并不都是以某种有保障的顺序排列一个队列的事实。

9、尽管我们没有无法控制线程调度程序,但可以通过别的方式来影响线程调度的方式。

架构

架构的本质

  一个软件系统随着功能越来越多,调用量急剧增长,整个系统逐渐碎片化,越来越无序,最终无法维护和扩展,所以系统在一段时间的野蛮生长后,也需要及时干预,避免越来越无序。

架构的本质就是对系统进行有序化重构,架构实现无序到有序的基本手段就是分和合,先把系统打散,然后重新组合。

分:合理定位

分的过程是把系统拆分为各个(子系统/模块/组件),拆的时候,首先要解决每个组件的定位问题,然后才能划分彼此的边界,实现合理的拆分。

合:有机整体

合就是根据最终要求,把各个分离的组件有机整合在一起。

架构分类和服务对象

 单体式应用架构

软件的三层架构是应用在逻辑上分成了三层,但它并不是物理上的分层。这也就意味着,经历过编译(如果非静态语言,可以跳过编译阶段)、打包、部署后,不考虑负载均衡以及水平扩展的情况,最终还是运行在同一个机器的同一个进程中。对于这种功能集中、代码和数据中心化、一个发布包、部署后运行在同一进程的应用程序,我们通常称之为单体式架构应用。

单体式架构应用优势与挑战

优势:(易于水平伸缩)、(易于开发、部署、测试)

挑战:(技术选型成本高)、(新人培养周期长)、(持续交付周期长)、(维护成本增加)

什么是为服务架构?

微服务是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块为基础,利用模组化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关的API集相互通讯。

Dubbo是什么?

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)

Dubbo核心部分包括

1.远程通讯:提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。

2.集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。

3.自动发现:基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

Dubbo能做什么?

1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。

2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。

3.服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

Dubbo架构图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值