线程

node.js 是什么

£可爱£侵袭症+ 提交于 2020-03-30 05:22:29
node.js 到底是什么? node.js 是一个 js 的运行环境和 api 集合,为本来只能在浏览器沙盒中运行的 js 提供了与操作系统进行交互的能力,从此 js 也和其它的后台语言一样可以操作文件,监听网络端口,读写数据库,与操作系统底层交互了。 为什么要有 node.js 呢? 因为传统的同步模型的服务系统很难应对 C10K 问题,也就是很难设计出能轻松并发上万连接的服务端。node.js 通过提供原生的异步服务模型,能够轻松实现高并发服务器,从前需要各种优化才能实现的并发性能,现在 node.js 原生就能支持。 node.js 为什么能高并发? 要回答这个问题,首先要问为什么其它的同步模型的服务端为什么难以实现高并发?同步模型服务器在收到一个请求以后,就要创建一个新的线程来处理用户请求,这个线程有创建开销,运行时有内存占用,执行时对于文件操作和数据库读取需要阻塞后续代码,处理完请求之后需要再销毁相应线程,即使使用线程池来操作,也有线程切换开销,而且多线程编程对于开发者的心智要求也很高,很容易写出有问题的代码。所以,同步模型的时间开销和内存开销在并发量上来之后会线性增加,很快就会达到服务器无法支撑的地步,只有通过特殊优化才能支撑起高并发。 node.js 提供了大量的异步 api,使典型的服务端非阻塞 I/O 操作比如网络请求,文件读写,数据库读写等可以异步执行,I/O

sleep() 和 wait() 有什么区别?

半城伤御伤魂 提交于 2020-03-30 03:57:22
sleep() 和 wait() 有什么区别? sleep()和wait()都是线程暂停执行的方法。 1、这两个方法来自不同的类分别是Thread和Object,sleep方法属于Thread类中的静态方法,wait属于Object的成员方法。 2、 sleep() 是线程类(Thread)的方法,不涉及线程通信,调用时会暂停此线程指定的时间,但监控依然保持, 不会释放对象锁 ,到时间 自动恢复 ; wait() 是Object的方法,用于线程间的通信,调用时会 放弃对象锁 ,进入 等待 队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才进入对象锁定池准备获得对象锁进入运行状态。 3、wait,notify和notifyAll只能在 同步控制方法 或者 同步控制块 里面使用,而sleep可以在任何地方使用(使用范围)。 4、sleep()方法必须捕获异常InterruptedException,而wait()\notify()以及notifyAll()不需要捕获异常。 注意:   sleep方法只让出了CPU,而并不会释放同步资源锁。   线程执行sleep()方法后会转入阻塞状态。   sleep()方法指定的时间为线程不会运行的最短时间。因此,sleep()方法不能保证该线程睡眠到期后就开始执行。   notify的作用相当于叫醒睡着的人

Android中的DDMS进行调试

心不动则不痛 提交于 2020-03-30 03:06:52
原文链接: http://docs.eoeandroid.com/tools/debugging/ddms.html 安卓附带了一个叫Dalvik调试跟踪服务(DDMS)的调试工具它提供端口转发服务,屏幕截屏,线程和堆栈信息,日志,进程,电话状态信息,模拟来电和短信,模拟本地数据,等等。本页提供DDMS最新的功能概述;但不是所有功能和要点的详尽介绍。 运行DDMS DDMS集成在Eclipse中,同时也附带在SDK下的tools目录下。DDMS既可以在模拟器中工作也可以在已连接的设备上工作。如果同时连接了设备和运行了模拟器,DDMS默认在模拟器中运行。 从Eclipse打开:点击* Window > Open Perspective > Other... > DDMS* 。 从命令行打开:在tools目录下输入ddms(或./ddms在Mac/Linux) DDMS怎样与调试器交互 在安卓平台上,每个应用都运行在自己的进程上,同时每个应用也都运行在自己的虚拟机(VM)上。每个VM公布了唯一的端口号以供调试器连接。 当DDMS启动后,会连接到adb。当有设备连接上,VM监测服务就在adb和DDMS之间创建,它会通知DDMS 设备上的VM是启动了还是终止了。一旦VM是运行的,DDMS就获取VM的进程ID(pid),通过adb和设备上的adb守护进程(adbd)建立到 VM调试器的连接

ThreadLocal的进化——InheritableThreadLocal

∥☆過路亽.° 提交于 2020-03-30 02:26:20
之前有介绍过 ThreadLocal,JDK 后来针对此做了一个升级版本 InheritableThreadLocal,今天就来好好介绍下。 为什么要升级 首先我们来想想,为什么要升级?这就要说起 ThreadLocal 的功能了。 我们知道,ThreadLocal 设计初衷是为了在多线程环境下,针对每一个线程能有一个自己的副本,这样可以在一定程度上解决多线程并发修改的问题。但是,我们可以在此基础上做一个拓展,比如 context ,我们可以利用 ThreadLocal 针对每一个线程都有一个自己的上下文,一般都是写成 ThreadLocal<Context> ,这样在这个线程上做的所有修改都可以被大家利用到。 此时设想一下,假如我们新建一个子线程,那这个子线程可以获取到父线程的 context 吗?理论上希望可以达成这样的效果,实际上呢?让我们看看: public class ThreadLocalContext { private static ThreadLocal<Context> context = new ThreadLocal<>(); static class Context { String name; int value; } public static void main(String[] args) { Context context = new

应届生经典面试题:说说进程与线程的区别与联系

老子叫甜甜 提交于 2020-03-29 23:05:53
这问题,估计计算机专业的同学在找研发等工作的时候都会遇到过。前几天某老牌软件厂商的电话面试就提到了这一经典问题,今天招聘会上又有不少同学说在面试的时候被问到这点。在这里我就起个头,大家有啥想法意见等都欢迎回帖交流。 要了解二者的区别与联系,首先得对进程与线程有一个宏观上的了解。 进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竟争计算机系统资源的基本单位。每一个进程都有一个自己的地址空间,即进程空间或(虚空间)。进程空间的大小 只与处理机的位数有关,一个 16 位长处理机的进程空间大小为 216 ,而 32 位处理机的进程空间大小为 232 。进程至少有 5 种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态。 线程,在网络或多用户环境下,一个服务器通常需要接收大量且不确定数量用户的并发请求,为每一个请求都创建一个进程显然是行不通的,——无论是从系统资源开销方面或是响应用户请求的效率方面来看。因此,操作系统中线程的概念便被引进了。线程,是进程的一部分,一个没有线程的进程可以被看作是单线程的。线程有时又被称为轻权进程或轻量级进程,也是 CPU 调度的一个基本单位。 说到这里,我们对进程与线程都有了一个大体上的印象,现在开始说说二者大致的区别。 进程的执行过程是线状的 ,尽管中间会发生中断或暂停,但该进程所拥有的资源只为该线状执行过程服务

JAVA内存高分析

旧时模样 提交于 2020-03-29 18:39:45
一、使用top命令查看占用高资源的java项目的进程ID(pid): top 二、查看该进程中的线程所占用资源的情况:top -Hp pid 三、查看该线程对应的16进制:printf %x 11129   打印并保存该进程中堆栈的使用信息日志:jstack -l 11095 >> jstack.log 四、查看该进程中使用高资源的线程的具体信息日志:vim jstack.log   查找上一步的16进制的线程id:/2b79 jmap -histo 线程PID # 查看堆的使用情况,各个堆空间的占用情况 # 查询进程id垃圾回收情况 jstat -gcutil 线程PID 来源: https://www.cnblogs.com/clarino/p/12593822.html

Java学习升阶 -02-单例模式设计分析

半世苍凉 提交于 2020-03-29 14:01:32
单例模式定义 单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。 单例模式的作用 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为方便管理,也使系统资源占用率大大降低,也可以提高公共资源载入速度。 应用场景 比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。需要频繁的进行创建和销毁的对象;创建对象时耗时过多或耗费资源过多,但又经常用到的对象;频繁访问数据库或文件的对象。那么可以初步归纳一下应用场景: 公用静态资源类 如前端中模版页、图片链接等等 全局信息类 全局计数、环境变量、系统基本配置等 无状态工具类 日志工具、字符串工具、文件处理、图片上传等 单例模式的实现方法 饿汉式 public class Singleton { private final static Singleton INSTANCE = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return INSTANCE; } } 同静态代码块方式: public

多线程同步中的门道(二)

纵然是瞬间 提交于 2020-03-29 13:01:14
多线程同步中的门道(二) 前言   在涉及到多线程的开发时,线程同步的考虑是不可缺少的,否则很可能会造成各种超出预料的错误结果。以自己的学习经历来说,对于刚开始接触线程同步的人可能会感觉非常简单,在多线程操作可能会造成数据混乱的地方同步一下不就行了嘛,加个synchronized关键字,多简单!可是随着开发的深入,会渐渐的发现仅仅是一个synchronized关键字也不是那么简单,里面的门道和考虑到的情况还是不少。本系列就着循序渐进的程序和大家探讨一下synchronized关键字使用中的各种情形和会造成的各种意料之外和意料之中的结果,欢迎各位大神轻拍。 转载请注明本文地址: http://www.cnblogs.com/hellojava/p/3635336.html 系列文章: 多线程同步中的门道(一)   synchronized涉及到同步方法、同步代码块、同步类、同步对象、静态方法等,本系列来挨个探讨。   注:因为考虑到文章篇幅和为了突出我们要分析的关键代码,所以下面程序有可能不会是最优写法。 同步代码块   同步代码块,分为同步对象和同步类两种,下面我们来挨个介绍。 同步对象   我们首先来看看一个同步对象的例子。   [测试程序4.1] /** * Test case 4.1. synchronized code block.synchronized object.

Java回顾之多线程同步

这一生的挚爱 提交于 2020-03-29 12:48:23
在这篇文章里,我们关注线程同步的话题。这是比多线程更复杂,稍不留意,我们就会“掉到坑里”,而且和单线程程序不同,多线程的错误是否每次都出现,也是不固定的,这给调试也带来了很大的挑战。   在这篇文章里,我们首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控制同步,接下来我们会仿照回顾网络通信时那样,构建一个服务器端的“线程池”,JDK为我们提供了一个很大的concurrent工具包,最后我们会对里面的内容进行探索。   为什么要线程同步?   说到线程同步,大部分情况下, 我们是在针对“ 单对象多线程 ”的情况进行讨论,一般会将其分成两部分,一部分是关于“共享变量”,一部分关于“执行步骤”。   共享变量   当我们在线程对象(Runnable)中定义了全局变量,run方法会修改该变量时,如果有多个线程同时使用该线程对象,那么就会造成全局变量的值被同时修改,造成错误。我们来看下面的代码: 1 class MyRunner implements Runnable 2 { 3 public int sum = 0; 4 5 public void run() 6 { 7 System.out.println(Thread.currentThread().getName() + " Start."); 8 for (int i = 1; i <= 100; i++) 9 {

Java 线程是什么-渐入佳境

二次信任 提交于 2020-03-29 12:16:33
线程:(一)什么是线程 管哥说:程序中有多个执行流就叫 多线程 。多线程是多任务的一种特别的形式. 好处 :单个程序可以创建多个并发执行的程序来完成各自的任务。 多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。 进程 :一个进程包括由操作系统分配的内存空间,包含一个或多个线程。 一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。 时间轮转片: 每个线程都有自己的寄存器 创建线程的方法: 通过实现 Runnable 接口; 通过继承 Thread 类本身; 通过 Callable 和 Future 创建线程。 开启线程的小例子 : 开始实战(一)卖票: 三个窗口同时卖100张票;当票数还有时,就能够卖票(建立三个线程去做同一件事情) Thread.currentThread().getName();//获取线程优先级高的窗口的名字(此处为系统随机抽取一个优先级高的窗口) 卖票程序,多线程即多窗口同时卖100张票,此处注意系统打印是没有先后顺序的 结果: 窗口:窗口2正在卖第100张票 窗口:窗口2正在卖第99张票 窗口:窗口2正在卖第98张票 窗口:窗口2正在卖第97张票 窗口:窗口2正在卖第96张票 窗口:窗口2正在卖第95张票 窗口:窗口2正在卖第94张票 窗口:窗口2正在卖第93张票 窗口