当前位置: 首页 > news >正文

网站建设需求计划书做网站的公司深圳

网站建设需求计划书,做网站的公司深圳,二手车网站模版售价,建设网站 容量一、mysql使用innodb引擎#xff0c;请简述mysql索引的最左前缀如何优化orderby语句#xff1f; 关键点#xff1a; #xff08;1#xff09;如果排序字段不在索引列上#xff0c;filesort有两种算法#xff1a;mysql就要启动双路排序和单路排序 #xff08;2#x…一、mysql使用innodb引擎请简述mysql索引的最左前缀如何优化orderby语句 关键点 1如果排序字段不在索引列上filesort有两种算法mysql就要启动双路排序和单路排序 2无过滤不索引 3order by 非最左filesort 4顺序错 filesort 5方向反 filesort答案 1首先要对SQL进行分析检查必要的的查询字段、过滤字段、排序字段是否按顺序创建好了索引 2如果查询字段不再索引中可能会产生回表操作导致filesort降低性能 3一定要过滤字段不然不能使用索引 4排序字段和索引顺序不一致会导致filesort降低性能 5多个字段排序时如果方向不一致也会导致filesort降低性能 6使用explain观察查询类型和索引利用情况 7尽可能减少不必要的filesort实验准备向表中插入50w条数据 在做优化之前要准备大量数据。接下来创建两张表并往员工表里插入50W数据部门表中插入1W条数据。 怎么快速插入50w条数据呢 存储过程 怎么保证插入的数据不重复函数 部门表 id自增长 deptName随机字符串允许重复 address随机字符串允许重复 CEO1-50w之间的任意数字 员工表 id自增长empno可以使用随机数字或者从1开始的自增数字不允许重复name随机生成允许姓名重复age区间随机数deptId1-1w之间随机数 总结 需要产生随机字符串和区间随机数的函数。 创建表 CREATE TABLE dept (id INT(11) NOT NULL AUTO_INCREMENT,deptName VARCHAR(30) DEFAULT NULL,address VARCHAR(40) DEFAULT NULL,ceo INT NULL ,PRIMARY KEY (id) ) ENGINEINNODB AUTO_INCREMENT1;CREATE TABLE emp (id INT(11) NOT NULL AUTO_INCREMENT,empno INT NOT NULL ,name VARCHAR(20) DEFAULT NULL,age INT(3) DEFAULT NULL,deptId INT(11) DEFAULT NULL,PRIMARY KEY (id)#CONSTRAINT fk_dept_id FOREIGN KEY (deptId) REFERENCES t_dept (id) ) ENGINEINNODB AUTO_INCREMENT1;创建函数 -- 查看mysql是否允许创建函数 SHOW VARIABLES LIKE log_bin_trust_function_creators; -- 命令开启允许创建函数设置global-所有session都生效 SET GLOBAL log_bin_trust_function_creators1; -- 随机产生字符串 DELIMITER $$ CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255) BEGIN DECLARE chars_str VARCHAR(100) DEFAULT abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ;DECLARE return_str VARCHAR(255) DEFAULT ;DECLARE i INT DEFAULT 0;WHILE i n DO SET return_str CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1RAND()*52),1)); SET i i 1;END WHILE;RETURN return_str; END $$-- 假如要删除 -- drop function rand_string;-- 用于随机产生区间数字 DELIMITER $$ CREATE FUNCTION rand_num (from_num INT ,to_num INT) RETURNS INT(11) BEGIN DECLARE i INT DEFAULT 0; SET i FLOOR(from_num RAND()*(to_num -from_num1)); RETURN i; END$$-- 假如要删除 -- drop function rand_num;创建存储过程 -- 插入员工数据 DELIMITER $$ CREATE PROCEDURE insert_emp(START INT, max_num INT) BEGIN DECLARE i INT DEFAULT 0; #set autocommit 0 把autocommit设置成0 SET autocommit 0; REPEAT SET i i 1; INSERT INTO emp (empno, NAME, age, deptid ) VALUES ((STARTi) ,rand_string(6), rand_num(30,50), rand_num(1,10000)); UNTIL i max_num END REPEAT; COMMIT; END$$-- 删除 -- DELIMITER ; -- drop PROCEDURE insert_emp;-- 插入部门数据 DELIMITER $$ CREATE PROCEDURE insert_dept(max_num INT) BEGIN DECLARE i INT DEFAULT 0; SET autocommit 0; REPEAT SET i i 1; INSERT INTO dept ( deptname,address,ceo ) VALUES (rand_string(8),rand_string(10),rand_num(1,500000)); UNTIL i max_num END REPEAT; COMMIT; END$$-- 删除 -- DELIMITER ; -- drop PROCEDURE insert_dept;调用存储过程 -- 执行存储过程往dept表添加1万条数据 CALL insert_dept(10000); -- 执行存储过程往emp表添加50万条数据编号从100000开始 CALL insert_emp(100000,500000); 批量删除表索引 -- 批量删除某个表上的所有索引 DELIMITER $$ CREATE PROCEDURE proc_drop_index(dbname VARCHAR(200),tablename VARCHAR(200)) BEGINDECLARE done INT DEFAULT 0;DECLARE ct INT DEFAULT 0;DECLARE _index VARCHAR(200) DEFAULT ;DECLARE _cur CURSOR FOR SELECT index_name FROM information_schema.STATISTICS WHERE table_schemadbname AND table_nametablename AND seq_in_index1 AND index_name PRIMARY ;DECLARE CONTINUE HANDLER FOR NOT FOUND set done2 ; OPEN _cur;FETCH _cur INTO _index;WHILE _index DO SET str CONCAT(drop index ,_index, on ,tablename ); PREPARE sql_str FROM str ;EXECUTE sql_str;DEALLOCATE PREPARE sql_str;SET _index; FETCH _cur INTO _index; END WHILE;CLOSE _cur; END$$-- 执行批量删除dbname 库名称, tablename 表名称 CALL proc_drop_index(dbname,tablename); 最左前缀法则示例 假设index(a,b,c) Where语句索引是否被使用where a 3Y,使用到awhere a 3 and b 5Y,使用到abwhere a 3 and b 5 and c 4Y,使用到a,b,cwhere b 3 或者 where b 3 and c 4 或者 where c 4Nwhere a 3 and c 5使用到a 但是c不可以b中间断了where a 3 and b 4 and c 5使用到a和b c不能用在范围之后b断了where a is null and b is not nullis null 支持索引 但是is not null 不支持,所以 a 可以使用索引,但是 b不一定能用上索引8.0where a 3不能使用索引where abs(a) 3不能使用 索引where a 3 and b like ‘kk%’ and c 4Y,使用到a,b,cwhere a 3 and b like ‘%kk’ and c 4Y,只用到awhere a 3 and b like ‘%kk%’ and c 4Y,只用到awhere a 3 and b like ‘k%kk%’ and c 4Y,使用到a,b,c 一般性建议 Ø 对于单键索引尽量选择过滤性更好的索引例如手机号邮件身份证Ø 在选择组合索引的时候过滤性最好的字段在索引字段顺序中位置越靠前越好。Ø 选择组合索引时尽量包含where中更多字段的索引Ø 组合索引出现范围查询时尽量把这个字段放在索引次序的最后面Ø 尽量避免造成索引失效的情况开始实验 删除索引 drop index idx_age_name_deptid on emp; 创建索引CREATE INDEX idx_age_deptid_name ON emp (age,deptid,NAME); 1、无过滤不索引 EXPLAIN SELECT * FROM emp ORDER BY age,deptid; EXPLAIN SELECT * FROM emp ORDER BY age,deptid LIMIT 10; 增加过滤条件使用上索引了。 EXPLAIN SELECT age FROM emp where age1000 ORDER BY age,deptid,name;2、查询条件与筛选条件 const查询排序后回表操作不会filesort EXPLAIN SELECT * FROM emp WHERE age45 ORDER BY age,deptid,NAME; range查询Using index condition 没有完全使用索引 EXPLAIN SELECT * FROM emp WHERE age45 ORDER BY age,deptid,NAME; range查询Using where; Using index 完全使用索引 EXPLAIN SELECT age FROM emp WHERE age45 ORDER BY age,deptid,NAME;3、顺序错 filesort 正常情况 EXPLAIN SELECT age FROM emp WHERE age45 ORDER BY age,deptid,NAME; order by顺序变化会导致filesort EXPLAIN SELECT age FROM emp WHERE age45 ORDER BY deptid,age,NAME;4、order by非最左 filesort EXPLAIN SELECT age FROM emp WHERE age45 ORDER BY deptid,NAME;5、方向反 必排序 8.0为Backward index scan 倒序索引 EXPLAIN SELECT age FROM emp WHERE age45 ORDER BY age desc,deptid desc,NAME desc方向反 产生filesort EXPLAIN SELECT age FROM emp WHERE age45 ORDER BY age desc,deptid desc,NAME asc;二、数据库索引的原理?创建索引的缺点是什么什么情况索引失效?优化数据库的方法有哪些? 1、数据库索引的原理? 1以MySQL为例默认引擎innoDB使用了b树实现索引在索引查找时实现了log(n)的时间复杂度 2聚簇索引记录了主键ID【完整数据】非聚簇索引的索引树中记录数据【索引字段主键】 3在聚簇索引的叶子节点中记录了完整的值非聚簇索引的叶子节点记录的是主键以及索引字段如果需要完整值的话需要回表操作即使用主键去聚簇索引中再次查找完整数据 4索引的叶子节点以链表的形式存储方便顺序查找和排序 2、创建索引的缺点是什么 1会占用空间2更新时会级联更新索引3高并发写影响性能 3、什么情况索引失效 1计算、函数导致索引失效2LIKE以%开头索引失效3不等于【!】4IS NOT NULL 可能失效【不同版本和数据决定】IS NULL 有效5类型转换导致索引失效6数据库优化器觉得不用索引更快的时候失效 4、优化数据库的方法有哪些 1硬件【主要在存储层优化】2网络3操作系统调优4表结构设计优化5sql优化6减少函数使用7索引优化8大字段及全文检索优化9连接池优化10事务优化11数据库集群化12加入缓存13冷热存储14分库分表 三、数据连接池的工作机制是什么? 答 1. 预先创建好一些数据库连接放到连接池中 2. 连接池中设置最小连接数和最大连接数 3. 最小连接不断开和数据库的连接 4. 超过最小链接的那些线程在长时间不使用时会被回收也就是断开和数据库的连接 5. 所有向数据库发送请求的业务必须通过连接池获得数据库连接 6. 当连接全部在使用中可以使用队列等待四、说一下MySQL中事务的实现原理 Multi-Version Concurrency Control 多版本并发控制MVCC 是一种并发控制的方法一般在数据库管理系统中实现对数据库的并发访问 InnoDB是一个多版本的存储引擎。它保存有关已更改行的旧版本的信息以支持并发和回滚等事务特性。这些信息存储在一个称为回滚段的数据结构中的系统表空间或undo表空间中。参见第14.6.3.4节“撤消表空间”。InnoDB使用回滚段中的信息来执行事务回滚所需的撤消操作。它还使用这些信息构建行的早期版本以实现一致的读取 MVCC 的实现依赖于隐藏字段、Read View、undo log 隐藏字段 A 6-byte DB_TRX_ID 用来标识最近一次对本行记录做修改 (insert 、update) 的事务的标识符 即最后一次修改本行记录的事务 id。 如果是 delete 操作 在 InnoDB 存储引擎内部也属于一次 update 操作即更新行中的一个特殊位 将行标识为己删除并非真正删除。A 7-byte DB_ROLL_PTR 回滚指针指向该行的 undo log 。如果该行未被更新则为空.A 6-byte DB_ROW_ID 如果没有设置主键且该表没有唯一非空索引时InnoDB 会使用该 id 来生成聚簇索引. Read View 不同的事务隔离级别中当有事物在执行过程中修改了数据更新版本号在并发事务时需要判断一下版本链中的哪个版本是当前事务可见的。为此InnoDB有了ReadView的概念使用ReadView来记录和隔离不同事务并发时此记录的哪些版本是对当前访问事物可见的。 undo log 除了用来回滚数据还可以读取可见版本的数据。以此实现非锁定读 答 1. mysql是由mvcc实现的事务控制 2. MVCC 的实现依赖于隐藏字段、Read View、undo log 3. 在不同的事务隔离级别下通过设置readview内容控制了哪些数据可见于不可见五、JVM 1、JVM 内存模型中为什么要区分新生代和年老代对于新生代为什么又要区分eden 区survial区? 个人理解答案 1、主流垃圾回收器cms g1都使用了分代收集算法 2、正常系统运行时会有海量临时对象产生这些对象短期内大部分就会失效对于这些对象我们把他们临时放到新生代 3、新生代满了之后需要清理垃圾对象我们会吧有效对象复制到老年代以便后续继续使用 4、为了更有效的区分哪些对象应该被复制到老年代所以在新生代划分出了eden区和s0 s1区 5、细化后的新生代内部被再次划分以便保证高速读写同时内存连续 【1】新对象会被保存到eden区开始是空的所以内存连续eden区满了会把有效对象复制到s0s0也是空的所以也是连续空间 【2】清空eden区再次写入时又是连续空间 【3】s0 和 s1在命名上互换原来的s1等待写入空的 【4】eden区再次满了重复上面步骤 文心一言AI答案 2、说一下你理解的JVM原理 JVM 运行时数据区域包含堆、栈、本地方法栈、方法区 答案jvm是Java虚拟机我们的class文件运行在虚拟机上通过虚拟机解决了跨平台的问题jvm中有jmm来管理Java内存访问的方式不同的jvm实现性能关注有差异现在主流的实现是Hotspot垃圾回收器是G1jvm运行时内存中分为方法区堆栈本地方法栈执行代码时需要执行引擎。3、请简述一下JVM 加载 class 文件的原理机制 关键点1. 类加载器2. 魔数3. 元空间负责加载class文件class文件在文件开头有特定的文件标示并且ClassLoader只负责class文件的加载至于它是否可以运行则由Execution Engine决定。魔数 Class文件开头的四个字节的无符号整数称为魔数(Magic Number)。魔数是Class文件的标识。值是固定的为0xCAFEBABE如果一个Class文件的头四个字节不是0xCAFEBABE虚拟机在进行文件校验的时候会报错。使用魔数而不是扩展名来识别Class文件主要是基于安全方面的考虑因为文件扩展名可以随意更改。 类加载器分为四种前三种为虚拟机自带的加载器。 启动类加载器BootstrapC 负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class由C实现不是ClassLoader子类 也叫系统类加载器负责加载classpath中指定的jar包及目录中class 扩展类加载器ExtensionJava 负责加载java平台中扩展功能的一些jar包包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包 应用程序类加载器AppClassLoaderJava 用户自定义加载器 Java.lang.ClassLoader的子类用户可以定制类的加载方式 工作过程 1、当AppClassLoader加载一个class时它首先不会自己去尝试加载这个类而是把类加载请求委派给父类加载器ExtClassLoader去完成。2、当ExtClassLoader加载一个class时它首先也不会自己去尝试加载这个类而是把类加载请求委派给BootStrapClassLoader去完成。3、如果BootStrapClassLoader加载失败例如在$JAVA_HOME/jre/lib里未查找到该class会使用ExtClassLoader来尝试加载4、若ExtClassLoader也加载失败则会使用AppClassLoader来加载5、如果AppClassLoader也加载失败则会报出异常ClassNotFoundException 其实这就是所谓的双亲委派模型。简单来说如果一个类加载器收到了类加载的请求它首先不会自己去尝试加载这个类而是把请求委托给父加载器去完成依次向上。 好处防止内存中出现多份同样的字节码(安全性角度) 比如加载位于 rt.jar 包中的类 java.lang.Object不管是哪个加载器加载这个类最终都是委托给顶层的启动类加载器进行加载这样就保证了使用不同的类加载器最终得到的都是同样一个 Object对象。 六、选择题 1、典型的JDBC程序按(DBECFA)顺序编写( 排序) A.释放资源 B.获得与数据库的物理连接 C.执行SQL命令 D.注册JDBC Driver E.创建不同类型的Statement F.如果有结果集处理结果集 2、下列语句哪一个正确(b) A.Java 程序经编译后会产生 machine code B.Java 程序经编译后会产生 byte code C.Java 程序经编译后会产生 DLL D.以上都不正确 3、存在使i1i的数吗存在 int i Integer.MAX_VALUE; System.out.println(ii1);true4、Integer和int的区别 1、Integer是int的包装类int则是Java的一种基本的数据类型 2、integer实际是对象的引用当new一个integer时实际上生成一个指针指向对象而int则直接存储数值 3、integer的默认值是null而int的默认值是0 5、jsp的八个隐含对象有哪些? 关键点 jsp本质上就是servlet答不上来关系也不大 答 1 pageContext 类型PageContext 代表当前页面的上下文 作用可以获取到页面中的其他隐含对象同时它还是一个域对象。 2 request 类型HttpServletRequest 代表请求 作用可以获取用户发送的请求信息它也是一个域对象。 3 session 类型HttpSession 代表当前会话 作用可以作为域对象用来共享数据。 4 application 类型ServletContext 代表代表整个WEB应用 作用是JavaWeb中最大的域对象。 5 response 类型HttpServletResponse 代表响应 作用向浏览器发送响应信息 6 out 类型JspWriter 代表输出流 作用可以向页面输出内容 7 config 类型ServletConfig 代表当前JSP的配置信息 作用可以获取到Servlet标签中初始化参数 8 page 类型Object 在service方法中有如下代码 Object page this; 代表代表当前JSP的对象 9 exception 类型Throwable 代表异常信息 作用获取页面中的异常 6、下面程序能正常运行吗 null 是可以被强转成任何类型的2. 静态方法不需要实例对象 public class NULL {public static void haha() {System.out.println(haha);}public static void main(String[] args) {((NULL)null).haha();} }七、A 系统远程调用 B 系统的接口A 系统在完成调用之后需要更新A 系统本地表 问题1常见的远程调用有几种? 1. 自定义协议实现C/S RPC调用实现复杂需解决的问题多 2. UDP广播类型常见用于即时通讯类速度快但需要二次确认 3. 目前主流的基于http协议调用Restful风格的apispringcloud微服务调用使用的就是http 4. dubbo协议阿里出品长连接二进制封装数据性能较高 5. soap协议古老的webservice系列框架基于xml实现数据封装http协议传输 6. 异步响应式WebFluxSpring Data Reactive 7. 服务器推不主动调用常见系统通知类问题2对于有这些外部衔接的方法需要注意哪些问题?请写出注意问题及伪代码? 1、写好接口文档方便后续维护和团队协作 2、统一化的报文结构 3、标准化的服务状态码 status_code 200;//请求成功4、统一化请求日志记录及异常记录 GlobalExceptionHandler... logger.error(服务异常exception);5、当请求延迟过高可以快速失败 6、重试机制 // 服务列表 serverList {ser1,ser2,ser3} retrycount 0; retrymax10; maxrequesttime 200ms getxxoo(){try{// 尝试请求数据calldata(serverList)}catch (请求失败 500类异常 || 请求超时 calldata的网络请求方法中){// 拦截器记录日志serverList.remove(刚才请求的服务器)// 重试次数过多if (retrycount retrymax)return 当前访问不可用稍后再试retrycount ;递归调用本方法} }7、事务问题可回滚 getData(){分布式事务开启get1();get2();get3();事务结束要么全成功 要么全失败修改数据时使用 tryModify() 临时保存数据或通过Seata类似的框架实现 }8、数据一致性问题 //有并发修改数据时如果需要保证一致性需要使用分布式锁 //修改方法 modifyxx(){// 尝试加锁boolean haslock tryLock(id)if(haslock){httppost(url,data)releaseLock(id)}else{// 提示用户一会再试试// 尝试再次获取锁} }八、在如下代码中当调用insertA 方法的时候是否能在当insertA 方法调用insertB的时候如果insertB 插入b表的时候出现异常能否保证 insertA中的a 表插入成功如果不能应该如何修改。 Service Transactional public class TestServie {Autowiredprivate JdbcTemplate jt;public void insertA(){jt.execute(insert into a(m,n)values(1,2));insertB();}public void insertB(){jt.execute(insert into b(h,i)values(1,2));} }答案不能在类上使用了Transactional注解默认开启了全局读写事务因此可以将Transactional加在方法上即可。 九、数据库三范式是什么 1、第一范式单表字段拆分到不可拆分为止【有主键具有原子性字段不可分割】 2、第二范式每一行数据唯一性 3、第三范式单行数据中保留唯一主键建立外键关联表 答案 1. 数据库三范式是设计数据库表的方法论能够充分的利用关系型数据库把实体有机的关联起来 2. 降低耦合度节省存储空间十、浅谈ReentrantLock的设计 ReentrantLock 是在多线程竞争资源时使用的锁他是一个独占锁、可重入锁也是悲观锁ReentrantLock 支持公平锁对公平和非公平锁有不同的实现逻辑ReentrantLock 使用 aqsAbstractQueuedSynchronizer来实现的获取锁的线程队列等待的过程内部使用了原子操作类 cas 比较线程与对应的锁关系内部支持newCondition来灵活的控制获取到锁的线程的阻塞与释放 十一、值传递和引用传递问题 关键点1. 引用传递2. 堆栈内存分析 public class demo01 {public static void main(String args[]) {StringBuffer a new StringBuffer(A);StringBuffer b new StringBuffer(B);operater(a,b);System.out.println(a b);// AB B}public static void operater(StringBuffer x, StringBuffer y) {// x 是一个列表对象x.append(y) 实际上是在修改了 x 对象本身而不是替换整个对象。因此当您在 operater 方法中调用 x.append(y)x 列表会被修改为 [A, B]。由于 a 和 x 引用同一个对象它们指向同一个内存地址。所以当您在 operater 方法中修改了 x也会影响到 main 方法中的 ax.append(y);// 将x赋值给了y这意味着y也会引用AB。然而需要注意的是这个赋值操作只会在operater方法内部起作用并不会影响到main方法中的b对象。y x;System.out.println(x y);// AB AB} }十二、多线程 1、多线程中 start)方法和 run方法的区别是什么? 答 1. start用来启动线程改变的是线程的状态由就绪进入执行 2. run方法中包含要执行的代码在执行状态时运行里面的代码方法返回值是void2、创建线程有几种方式 1使用Thread类创建线程 public class MyThread extends Thread { public void run() { System.out.println(使用thread方式创建线程); } } // 创建并启动线程 MyThread thread new MyThread(); thread.start();2使用Runnable接口创建线程 public class MyRunnable implements Runnable { public void run() { System.out.println(使用Runnable方式创建线程); } } // 创建并启动线程 MyRunnable runnable new MyRunnable(); Thread thread new Thread(runnable); thread.start();3使用Executor框架创建线程 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MyThread implements Runnable { public void run() { System.out.println(使用ExecutorService方式创建线程);} public static void main(String[] args) { // 创建线程池 ExecutorService executor Executors.newFixedThreadPool(10); // 提交任务到线程池 executor.submit(new Mythread()); // 关闭线程池 executor.shutdown(); } }3、简单写一个会导致死锁的程序 获得锁后不释放其他线程一直拿不到锁解决不要嵌套获得多个锁 static Object lockA new Object();static Object lockB new Object();public static void main(String[] args) {new Thread(new Runnable() {Overridepublic void run() {System.out.println(Thread.currentThread() 尝试获取锁A);synchronized (lockA){System.out.println(Thread.currentThread() 获取到了锁A);try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(Thread.currentThread() 尝试获取锁B);synchronized (lockB){System.out.println(Thread.currentThread() 获取到了锁B);}}}}).start();new Thread(new Runnable() {Overridepublic void run() {System.out.println(Thread.currentThread() 尝试获取锁B);synchronized (lockB){System.out.println(Thread.currentThread() 获取到了锁B);try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(Thread.currentThread() 尝试获取锁A);synchronized (lockA){System.out.println(Thread.currentThread() 获取到了锁A);}}}}).start();}4、多线程变量同步 共享变量在多线程读取的时候会被拉倒线程本地white 在执行时一直使用的都是本地变量的值所以后续更改线程内一直访问不到最新变量程序会卡死给变量增加 volatile关键字保证多线程之间 变量可见性 public class ThreadSafeCache {private int result;public int getResult() {return result;}public synchronized void setResult(int result) {this.result result;}public static void main(String[] args) {ThreadSafeCache threadSafeCache new ThreadSafeCache();for (int i 0; i 8; i) {new Thread(() - {while (threadSafeCache.getResult() 100) {}System.out.println(我执行了);}).start();}try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}threadSafeCache.setResult(200);} }5、定义了一个类T,其中定义了一个synchronized 方法do; AnewT;B new T。当一个线程进入A对象的 do 方法后另一个线程是否可进入B对象的do 方法?互不影响 1. synchronize 普通方法锁的是当前对象 2. synchronize 静态方法锁的是class 3. 同步代码块可以手动指定锁对象是啥6、多线程有几种实现方法,都是什么? 实现Runnable接口 void返回值实现Callable接口 可以指定返回值 /*** 1. 创建Callable的实现类并重写call()方法该方法为线程执行体并且该方法有返回值*/ class MyCallableThread implements CallableInteger{Overridepublic Integer call() throws Exception {System.out.println(Thread.currentThread().getName() 执行了);return 200;} }public class CallableDemo {public static void main(String[] args) throws ExecutionException, InterruptedException {// 2. 创建Callable的实例并用FutureTask类来包装Callable对象// 3. 创建FutureTask对象需要一个Callable类型的参数FutureTask task new FutureTaskInteger(new MyCallableThread());// 4. 创建多线程由于FutureTask的本质是Runnable的实现类所以第一个参数可以直接使用tasknew Thread(task, threadName).start();//new Thread(task, threadName2).start();/*while (!task.isDone()) {System.out.println(wait...);}*/System.out.println(task.get());System.out.println(Thread.currentThread().getName() over!);} }7、编写一个基于线程安全的懒加载单例模式 关键点1. 多线程访问2. 防止直接new对象3. 使用锁4. 内部类加载实现、cas实现等 public class Test03 {private Test03(){}private static Test03 instance null;public static Test03 getInstance(){//有可能在多线程访问的时候 重复new了对象if(instance null){// 有可能有多个线程 进入抢锁等待状态synchronized (Test03.class){if (instance null){instance new Test03();}else {return instance;}}}return instance;} }十三、对于高并发、高可用问题的常用处理方式 1、对于高并发 关键点 寻找瓶颈分治思想业务拆分流程拆分扩容限流分流 cdn 缓存流量清洗 waf多级缓存设计 后端缓存客户端缓存日志溯源资源隔离弹性扩缩容降级处理 前后端 兜底数据 2、对于高可用 容器化管理 HAkeepalived 十四、哪一个List实现了最快插入 arraylist 数组实现的查询修改比较快 linkedlist链表实现插入删除比较快直接在最后插入数据即可 vectorjdk1.0就有 线程安全效率特别低十五、同步有几种实现方法,都是什么? 非阻塞 1. volatile 2. cas及atomic系列实现阻塞 1. wait() 2. sleep 3. synchronized 4. Lock 的实现1. ReentrantLock2. ReentrantReadWriteLock 等3. condition.await() 5. CountDownLatch 6. CyclicBarrier 7. Semaphore 8. BlockingQueue十六、SpringBoot 1、springboot是如何管理版本依赖的 1、springboot底层使用Maven管理依赖通过控制pom.xml父子关系来完成细节配置在父pom中定义具体框架和版本号以及额外的信息; 2、提供了很多场景的spring-boot-starter的pom.xml文件来标准化的引入依赖避免冲突 2、什么是自动配置 关键点 1. 看springboot的源码 2. SpringBootApplication 中包含的EnableAutoConfigurationSpringBootConfigurationComponentScan 注解 3. EnableAutoConfiguration 开启自动配置功能 内部还包含 AutoConfigurationPackage、Import1. AutoConfigurationPackage 中 Import(AutoConfigurationPackages.Registrar.class) 引入了 Registrar.class 完成批量注册默认扫描主启动类的包Bean或者Compont等注解2. Import(AutoConfigurationImportSelector.class) 4. ComponentScan 扫描被Compent(ServiceController)注解的bean 加载到容器中 5. SpringBootConfiguration 表示这是一个SpringBoot的配置类答 1. 所加载使用的jar包 如果是比较常见的spring都提供了默认配置也就是不像以前一样需要把框架的每一个属性都要配置一遍主要目的是简化开发 2. springboot 通过在启动类上添加注解 SpringBootApplication 完成自动配置 3. 内部完成了读取每个jar包下的META-INF/spring.factories和spring-boot-autoconfigure-2.6.7.jar中的默认配置3、起步依赖? 指的是各种starter重点是pom.xml,其中包含了框架所需要的其他依赖以及默认配置文件不需要我们手动配置了。 4、什么是Spring的依赖注入有哪些方法进行依赖注入 依赖注入是指将依赖的对象实例交给spring帮我们注入管理从而释放对对象的管理权比如可以统一替换接口的实现更高效的开发程序。 1、set方法注入2、构造方法注入3、Autowired【用于自动装配bean它可以根据类型进行注入】和Resource【用于获取指定名称的bean它可以根据名称进行注入】 5、Spring的AOP的使用情景有哪些?简述其实现原理
http://www.pierceye.com/news/668416/

相关文章:

  • 网站建设商城网站微信广告代理
  • 创建网站的方案企业营销策划公司
  • 做彩铃的网站个人博客网站建设
  • 正黄集团博弘建设官方网站达州高端网站建设
  • 七台河建设网站wordpress logo制作
  • 怎么设计一个自己的网站番禺网站建设效果
  • 网站哪家做的好淄博网站开发选网泰
  • 网站建设与制作与维护ppt百度广告联盟收益
  • 在线网站建设费用是多少大学生活动策划书模板
  • 动物网站建设wordpress无法跳转正确页面
  • 上海市建设工程 安全协会网站wordpress会员微信支付宝
  • pc网站转换手机网站代码桂林工作网招聘
  • 营销型网站建设的要素怎么建网站赚钱
  • 成都网站建设学习郑州制作网站推荐
  • 网站建设 镇江丹阳php网站开发实例教程代码
  • 佛山外贸网站建设方案专业网站建设系统
  • 做一个网站团队需要哪些人员花钱也可以哪些网站可以做推广广告
  • 各省施工备案网站做动漫网站的素材
  • 新余网站设计网站模板做网站
  • 防止服务器上的网站被进攻app推广兼职
  • 保定电商网站建设国内最好的crm软件
  • 企业网站建设哪家公司好莱芜金点子信息港房产网
  • 个人可以建设网站吗海淀网站建设本溪
  • 宜昌网站建设兼职怎样做自媒体拍视频赚钱
  • 我的世界做视频封面的网站免费的app源码网
  • 网站搭建wordpress参考消息电子版在线阅读
  • 成立一个网站平台要多少钱科技有限公司一般是做什么的
  • 邵阳 网站开发 招聘桂林阳朔楼盘最新价格
  • 如何建设网站导航内链接wordpress 特别慢
  • 蚌埠网站建设文章网站软件定制开发公司