线程

Object类实现的方法

谁说我不能喝 提交于 2020-03-08 03:50:50
---恢复内容开始--- 1、Clone   对象浅复制,实现Clonable接口可调用,否则CloneNotSupportedException异常 2、getClass   final方法,获得方法运行的类型 3、toString   最后转字符串等 4、finalize   释放资源 5、equals   注意“==”和equals的区别 6、hashCode   用于哈希查找 7、wait   线程等待对象锁,wait()一直等待,直到被中断wait(long timeout)设定时间间隔。 调用该方法后当前线程进入睡眠状态,直到以下事件发生。 (1)其他线程调用了该对象的notify方法。 (2)其他线程调用了该对象的notifyAll方法。 (3)其他线程调用了interrupt中断该线程。 (4)时间间隔到了。 此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常 8、notify   唤醒在该对象上等待的某个线程。 9、notifyAll   唤醒在该对象上等待的所有线程。 ---恢复内容结束--- 来源: https://www.cnblogs.com/lxli/p/8082424.html

高性能MySQL之架构与历史(1)

柔情痞子 提交于 2020-03-08 03:08:36
MySQL架构与历史 MySQL逻辑架构 第一层:mysql客户端,负责和mysql服务器连接处理、认证授权、安全、线程处理等。 第二层:大多数mysql的核心功能都在这一层,包括查询解析、分析、优化、查询缓存以及所有的内置函数(如:日期、时间的函数等),所有夸存储引擎的功能都在这一层实现:存储过程、触发器、视图等。 第三层:包含存储引擎,存储引擎负责mysql中数据的存储、提取、锁机制等。 注:存储引擎不会解析sql。单InnoDB是一个列外,他会解析外键定义,因为mysql服务器本身没有实现该功能。 连接管理与安全性 每个客户端链接都会在服务器进程中拥有一个线程。这个链接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心CPU中运行。 Mysql5.5版本支持线程池插件,可以使用池中少量的线程来服务大量的链接。 当客户端连接Mysql服务器时,会对其进行验证,验证成功后,服务器会继续验证是否具有某个查询的权限。 优化与执行 1.MySQL会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询、决定表的读取顺序,以及选择合适的索引等。 2.优化器并不关心表用的是什么存储引擎,但存储引擎对于优化查询是有影响的。 3.对于select语句,在解析查询之前,首页会在查询缓存中检查,如果能在查询缓存中检索到结果,那么就不会在进行查询解析、分析

浅析dubbo原理和实现 转

最后都变了- 提交于 2020-03-08 00:19:13
出处: 浅析dubbo原理和实现 一、Duboo基本概念解释 Dubbo是一种分布式服务框架。 Webservice也是一种服务框架,但是webservice并不是分布式的服务框架,他需要结合F5实现负载均衡。因此,dubbo除了可以提供服务之外,还可以实现软负载均衡。它还提供了两个功能Monitor 监控中心和调用中心。这两个是可选的,需要单独配置。 Dubbo的计数架构图如下: 我们解释以下这个架构图:   Consumer服务消费者,Provider服务提供者。Container服务容器。消费当然是invoke提供者了,invoke这条实线按照图上的说明当然同步的意思了,多说一句,在实际调用过程中,Provider的位置对于Consumer来说是透明的,上一次调用服务的位置(IP地址)和下一次调用服务的位置,是不确定的。这个地方就是实现了软负载。   Monitor这是一个监控,图中虚线表明Consumer 和Provider通过异步的方式发送消息至Monitor,Consumer和Provider会将信息存放在本地磁盘,平均1min会发送一次信息。Monitor在整个架构中是可选的(图中的虚线并不是可选的意思),Monitor功能需要单独配置,不配置或者配置以后,Monitor挂掉并不会影响服务的调用 二 分析源代码,基本原理如下:   1:client一个线程调用远程接口

c# invoke和begininvoke方法

冷暖自知 提交于 2020-03-07 23:35:32
转: http://wenku.baidu.com/view/b8677b18ff00bed5b9f31dbb.html 在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate,至于委托的本质请参考我的另一随笔: 一、 为 什 么 Control 类 提供了 Invoke 和 BeginInvoke 机制? 关于这个问题的最主要的原因已经是dotnet程序员众所周知的,我在此费点笔墨再次记录到自己的日志,以便日后提醒一下自己。 1 、 windows 程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着一个消息泵。这个消息泵让windows程序生生不息。 Windows GUI程序的消息循环 Windows程序有个消息队列,窗体上的所有消息是这个队列里面消息的最主要来源。这里的while循环使用了GetMessage()这个方法,这是个阻塞方法,也就是队列为空时方法就会被阻塞,从而这个while循环停止运动,这避免了一个程序把cpu无缘无故地耗尽,让其它程序难以得到响应。当然在某些需要cpu最大限度运动的程序里面就可以使用另外的方法,例如某些3d游戏或者及时战略游戏中,一般会使用PeekMessage()这个方法,它不会被windows阻塞,从而保证整个游戏的流畅和比较高的帧速。 这个主线程维护着整个窗体以及上面的子控件

高性能MySQL之锁详解

╄→尐↘猪︶ㄣ 提交于 2020-03-07 23:03:02
一、背景 MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。数据库锁的设计的初衷是处理并发问题。我们知道多用户共享资源的时候,就有可能会出现并发访问的时候,数据库就需要合理的控制资源的访问规则,因此,锁就应运而生了,它主要用来实现这些访问规则的重要数据结构。 二、全局锁 顾名思义,全局锁就是对整个数据库实例加锁,可以通过命令 Flush tables with read lock (FTWRL)对整个数据库实例子加锁。让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。 全局锁有一个经典的使用场景就是做全库逻辑备份,也就是说吧整个数据库的每个表都用select 出来存成文本。以前有一种做法是通过FTWRL确保不会有其他线程对数据库做更新,然后对整个库做备份。注意,在备份过程中整个库完全处于只读状态。 你此时是不是觉得很危险? 如果你在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆; 如果你在从库上备份,那么备份期间从库不能执行主库同步过来的binlog,会导致主从延迟。 看上去确实很危险,但是我们细想一下,备份为什么要加锁呢?如果我们不加锁又会出现什么问题呢? 假设你现在要维护京东的购买系统,关注的是用户账户余额表和用户商品表。

JAVA垃圾回收机制

痴心易碎 提交于 2020-03-07 22:23:18
一、概述 Java语言的特点就是将对象的管理权交给了内存管理机制,在jvm的自动内存管理机制下,不需要为每一个对象去写delete或者free代码,不容易出现内存泄漏或内存溢出的问题。但正因为java程序员将内存管理权力交给了内存管理机制,所以一旦出现内存泄漏或者内存溢出的问题,在对jvm内存结构不清楚的情况下,排查错误将会成为一项非常复杂且困难的工作。 二、运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 2.1、程序计数器 线程私有; 可以看作是当前线程所执行的字节码的行号指示器; 程序计数器是唯一不发生任何OutOfMemoryError的区域。 2.2、Java虚拟机栈 线程私有; 每个方法被执行的时候,虚拟机会创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息,每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程; 局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配的局部变量空间时完全确定的。 2.3、本地方法栈 与虚拟机栈所发挥的作用是非常相似的,其区别是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈是为虚拟机使用到的本地方法服务; Java方法是由Java语言编写,编译字节码,存储在class文件中,与平台无关,本地方法是由其他语言

The content of the adapter has changed but ListView did not receive a notification

旧时模样 提交于 2020-03-07 22:13:01
The content of the adapter has changed but ListView did not receive a notification 在 Android开发过程中,使用了大量的 ListView,发现这个错误偶尔会出现。特别是做压力测试的时候,不停的点击刷新,更容易出现这个错误。代码中已经使用了 Adapter的 notifyDataSetChanged()方法通知 UI更新了,但是还是会出现这个错误。究其根本原因,还是线程之间同步的问题。比如,线程 1更新了 Adapter中的内容,却还没有来得及通知内容已经更新,就又有线程 2更新了 Adapter中的内容,这个时候如果线程 1再通知内容更新,就会出现上述异常了。 在此提出一些解决办法: 对线程进行管理,如果当前 Actitivty暂停了,及时停止这些线程。 数据更新后,要及时使用 notifyDataSetChanged()方法通知 UI,避免出现数据不一致的情况。 数据的更新,最好放在主线程中进行。这样可以使用同步数据更新与通知内容更新部分的代码。 最后补充一条我最终解决问题的方法: 在用到多线程的时候,可以对数据做缓存处理, 比如与ListView绑定的数据存储在ArrayList ( dataList ), 在线程中先将数据加入到临时ArrayList( tmpList ) , 最后在调用

使用AIDL

 ̄綄美尐妖づ 提交于 2020-03-07 21:06:52
copy from: https://www.jianshu.com/p/8a188d1d973a 1.服务端 服务端首先要创建一个Service用来监听客户端的连接请求,然后创建一个AIDL文件,将暴露给客户端的接口在这个AIDL文件中声明,最后在Service中实现这个AIDL接口即可。 2.客户端 首先绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转成AIDL接口所属的类型,接着就可以调用AIDL中的方法了。需要注意的是,AIDL的包结构在服务端和客户端要保持一致,否则运行会出错,这是因为客户端需要反序列化服务端中和AIDL接口相关的所有类,如果类的完整路径不一样的话,就无法成功反序列化,程序也就无法正常运行。 步骤一:创建Book.java类、Book.aidl类、IBookManager.aidl类 详见: IPC机制(二) 步骤二:创建Service并重写IBookManager类 服务端 不要忘了在AndroidManifest.xml中注册: 清单文件注册 步骤三:在客户端中启动Service 客户端 运行结果: AIDL使用运行结果 假设有一种需求:用户不想时不时地去查阅图书馆列表了,于是他去问图书馆,“当有新书时能不能把新书的信息告诉我呢?”这是一种典型的观察者模式,每个感兴趣的用户都观察新书,当新书到的时候

(一)线程与锁

丶灬走出姿态 提交于 2020-03-07 19:25:17
一、线程的基本概念 1.1单线程 简单的说,单线程就是进程中只有一个线程。单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。 1.2多线程 由一个以上线程组成的程序称为多线程程序。常见的多线程程序如:GUI应用程序、I/O操作、网络容器等。 Java中,一定是从主线程开始执行(main方法),然后在主线程的某个位置启动新的线程。 二、线程的基本操作 2.1创建 Java中创建多线程有两种方法: 1.继承java.lang.Thread 上述代码中,MyThread类继承了类java.lang.Thread,并覆写了run方法。主线程从main方法开始执行,当主线程执行至t.start()时,启动新线程(注意此处是调用了start方法,不是run方法),新线程会并发执行自身的run方法。 2.实现java.lang.Runnable接口 上述代码中,MyThread类实现了java.lang.Runnable接口,并覆写了run方法,其它与继承java.lang.Thread完全相同。实际上,java.lang.Thread类本身也实现了Runnable接口,只不过Thread类的run方法主体里是空的,通常被子类覆写。 注意:主线程执行完成后,如果还有子线程正在执行,程序也不会结束。只有当所有线程都结束时(不包含Daemon Thread)

Autorelease Pool

帅比萌擦擦* 提交于 2020-03-07 18:39:29
现在已经是 ARC 时代了,但是了解更多的 Objective-C 的内存管理机制仍然是十分必要的。一直以来我都弄不清楚 autorelease 的原理,后面看了很多资料,才慢慢了解到 autorelease 的原理。 - (void)test { NSString *string = [NSString stringWithFormat:@"liuluoxing"]; NSString *string_weak_ = string; } 下面我们来捋一捋这个变量的内存引用计数的变化: 1.当使用 [NSString stringWithFormat:@"liuluoxing"] 创建一个对象时,这个对象的引用计数为 1 ,并且这个对象被系统自动添加到了当前的 autoreleasepool 中。 2.当使用局部变量 string 指向这个对象时,这个对象的引用计数 +1 ,变成了 2 。 3.当变量出了当前作用域时,局部变量 string 变成了 nil ,所以其所指向对象的引用计数变成 1 。 4.当出了 @autoreleasepool {} 的作用域时,其中的 autoreleased 对象被 release ,对象的引用计数变成 1 。当出了局部变量 string 的作用域,即 viewDidLoad 方法返回时,string 指向了 nil ,其所指向对象的引用计数变成