多线程
用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。
这个只对一半,因为反应多角色的程序代码,最起码每个角色都要给他一个线程,否则连实际场景无法模拟
当然也没法说能用单线程来实现:比如最常见的生产者消费者模型.
多线程: 指的是这个程序运行时产生了不止一个线程
并行与并发:
- 并行: 多个cpu实例或者多台机器同时执行一段处理逻辑
- 并发: 通过cpu调度算法,让用户看上去是同时执行,实际上从cpu操作层面不是真正的同时.并发往往在场景中有公共的资源,那么针对这个公共的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力.
并发与并行:
- 线程安全: 经常用开描述一段代码.只在并发情况下,该代码经过多线程的使用,线程的调度顺讯不影响任何结果。这个时候使用多线程,我们只需要关注系统的内存,cpu是不是够用即可,反过来,线程不安全意味着线程的调度顺序会影响最终结果,如不加事务的转账代码:
void transferMoney(User from, User to, float amount) {
to.setMoney(to,getBalance() + amount);
from.setMoney(from.getBalance() - amount);
}
- 同步: java中的同步指的是通过人为的控制和调度,保证共享资源的多线程访问成为线程安全,来保证结果的准确。如上面代码加入
@synchronized
关键字,在保证结果准确的同事,提高性能,才是优秀的程序。线程安全的优先级高于性能.
java中线程的状态分为6种
-
1.初始(NEW) : 新创建了一个线程对象,但还没有调用
start()
方法. -
2运行(RUNNABLE): JAVA线程中将就绪(ready)和(runnin)两种状态笼统的称为运行。线程对象创建后,其他线程(比如main线程) 调用了该对象的
start()
方法,该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready).就绪状态的线程在获得CPU时间片后变为运行中状态(running) -
阻塞(BLOCKED): 表示线程阻塞于锁
-
等待(WAITING): 进入该状态的线程需要等待其他线程做出一些特定的动作(通知或中断)
-
超时等待(TIMED_WAITING): 该状态不同于WAITING,它可以在指定的时间后自行返回
-
终止(TERMINATED): 表示该线程已经执行完毕.
-
TPS; transaction Per second (每秒传输的事务处理个数), 既服务器每秒处理的是无数. TPS包括一条消息如和一条消息出,加上一次用户数据库的访问.(业务的TPS = CAPS * 每个呼叫平均TPS)
TPS是软件测试结果的测量单位.一个事务是指一个客户拒想服务器发送请求然后服务器做出反应的过程.客户机在发送请求时开始计时,收到服务器响应后结束计时,一次来计算使用的时间和完成的事务个数.
一般的,评价系统性能均以眉毛中完成的技术交易数量来衡量,系统整体处理能力取决于处理能力最低模块的TPS值
-
QPS:每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量
对应就是每秒响应的请求数,也是最大吞吐能力