Entry

Spring入门详细教程(二)

我的梦境 提交于 2020-12-06 00:30:31
前言 本篇紧接着spring入门详细教程(一),建议阅读本篇前,先阅读第一篇。链接如下: Spring入门详细教程(一) https://www.cnblogs.com/jichi/p/10165538.html 一、spring注入方式 1、set方法注入 <bean name="user" class ="com.jichi.entity.User" >   <property name="name" value="小明"></property>   <property name="age" value="18"></property> </bean> 2、构造方法注入 <bean name="user" class ="com.jichi.entity.User" > <constructor-arg name="name" value="小红" ></constructor-arg>   <constructor-arg name="age" value="50"></constructor-arg> </bean> 3、p名称空间注入 xmlns:p="http://www.springframework.org/schema/p" <bean name="user" class ="com.jichi.entity.User" p:name="小白" p:age="10

面试官问:平常你是怎么对Java服务进行调优的?

和自甴很熟 提交于 2020-12-05 02:55:43
点击关注上方“ 程序员私房菜 ”,设为“置顶或星标”,第一时间送达技术干货。 来源:http://t.cn/AiCTERJz Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢、接口超时,服务器负载高、并发数低,数据库频繁死锁等。尤其是在“糙快猛”的互联网开发模式大行其道的今天,随着系统访问量的日益增加和代码的臃肿,各种性能问题开始纷至沓来。 Java 应用性能的瓶颈点非常多,比如磁盘、内存、网络 I/O 等系统因素,Java 应用代码,JVM GC,数据库,缓存等。笔者根据个人经验,将 Java 性能优化分为 4 个层级:应用层、数据库层、框架层、JVM 层 ,如图 1 所示。 图 1.Java 性能优化分层模型 每层优化难度逐级增加,涉及的知识和解决的问题也会不同。比如应用层需要理解代码逻辑,通过 Java 线程栈 定位有问题代码行等;数据库层面需要 分析 SQL、定位死锁 等;框架层需要 懂源代码 , 理解框架 机制;JVM 层需要对 GC 的类型和工作机制有深入了解,对 各种 JVM 参数 作用了然于胸。 围绕 Java 性能优化,有两种最基本的分析方法: 现场分析法和事后分析法。 现场分析法 通过保留现场,再采用诊断工具分析定位。现场分析对线上影响较大,部分场景(特别是涉及到用户关键的在线业务时)不太合适。 事后分析法 需要尽可能多收集现场数据

鸿蒙OS应用开发实践(三)

做~自己de王妃 提交于 2020-12-04 17:48:27
经过前两篇的学习,我们了解了DevEco运行一个程序的基本流程和一个鸿蒙OS应用项目的代码结构。 用一句《三体》格式的话说:跑得动hello world,我们就是同志了。 这一篇,我们就自己手动撸一个简单的鸿蒙交互程序:从一个页面跳转到另一个页面。 (一)创建工程 先创建一个新的TV的empty java工程: 点finish后,发现这次从创建到项目环境加载完成,用了很短的时间,这是因为初始环境需要各种配置和下载,类似我们初下完一个大型游戏,首次需要更新内容一般。 (二)自定义布局 进入界面后,默认的IDE已经创建了一个hello world程序,我们打开entry -> src -> main ->resources -> base -> layout -> ability_main.xml 布局文件: 我们先清掉原本的布局,重新写入我们自己的布局: <?xml version="1.0" encoding="utf-8"?> <DependentLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:width="match_parent" ohos:height="match_parent" ohos:background_element="#000000"> <Text ohos:id="$+id:text"

Java中的ThreadLocal

一世执手 提交于 2020-12-04 13:46:31
关于 ThreadLocal,我们经常用它来解决多线程并发问题,那它究竟是如何做到的?今天就让我们来好好看一下。 从源码入手 首先,让我们看看 ThreadLocal 类中的介绍: This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable. ThreadLocal instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID). Each thread holds an implicit reference to its copy of a thread-local variable as long as the thread is alive and the ThreadLocal

Tushare-SDK

泄露秘密 提交于 2020-12-04 10:12:39
tushare一直没有出java的sdk,好在出了http协议的api.本项目根据http的api封装而成 gitee地址 https://gitee.com/ichiva/tushare-sdk.git 项目目录 定义实体类 @Getter @Setter public class TuTable implements Serializable { private String[] fields; private String[][] items; } 定义获取数据的接口 /** * tu 数据 */ public interface TuData { /** * 获取数据 * @return */ Optional<TuTable> get(); } 定义api请求和应答 请求 @Data public class TuRequest implements Serializable { /** * 接口名 */ private String api; private String token; /** * 输入参数 */ private Map<String,String> params; /** * 输出参数 */ private String[] fields; /** * 输出参数描述 */ private String[] fieldsName; /** * 接口描述

Java内存泄漏分析系列之四:jstack生成的Thread Dump日志线程状态

醉酒当歌 提交于 2020-12-04 01:57:14
原文地址:http://www.javatang.com Thread Dump日志的线程信息 以下面的日志为例: "resin-22129" daemon prio=10 tid=0x00007fbe5c34e000 nid=0x4cb1 waiting on condition [0x00007fbe4ff7c000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:315) at com.caucho.env.thread2.ResinThread2.park(ResinThread2.java:196) at com.caucho.env.thread2.ResinThread2.runTasks(ResinThread2.java:147) at com.caucho.env.thread2.ResinThread2.run(ResinThread2.java:118) "Timer-20" daemon prio=10 tid=0x00007fe3a4bfb800 nid=0x1a31 in Object.wait()

整天都在讨论使用SpringBoot,可你居然连缓存都不清楚

荒凉一梦 提交于 2020-12-03 14:34:56
缓存技术是一个让所有开发人员又爱又恨的技术,我们爱缓存是因为缓存能给我们带来数量级的响应和流量,但是最迷人的反而最危险,如果缓存用不好也是灾难级别的,特别是一些涉及到公司主要现金流的业务,如果因为我们使用缓存不当,而带给公司一定的损失,不亚于删库跑路的那个大兄弟,那今天我们就来看一下springboot的缓存都有那些东西,学习嘛,一点点的来,慢慢积累自己的经验,才能厚积薄发 文章首发公众号:Java架构师联盟,每日更新技术好文 一、JSR107缓存规范 为了缓存开发规范的统一,以及提升系统的扩展性,J2EE发布了JSR107缓存规范。 主要是Java Caching定义了5个接口,分别是 CachingProvider、CacheManager、Cache、Entry、Expiry。 下面我们分开详细的展开看一下 CachingProvider: 可以创建、配置、获取、管理和控制多个CacheManager,一个Application在运行期间可以访问多个CachingProvider。 CacheManager: 可以创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。 Cache: 是一个类似于Map的数据结构并临时存储以Key为索引的值

深入Linux并发同步

微笑、不失礼 提交于 2020-12-03 11:53:25
并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理多个任务的能力。并发和并行看起来很像,但实际上是有区别的,如下图(图片来源于网络): 上图的意思是,有两条在排队买咖啡的队列,并发只有一架咖啡机在处理,而并行就有两架的咖啡机在处理。咖啡机的数量越多,并行能力就越强。 可以把上面的两条队列看成两个进程,并发就是指只有单个CPU在处理,而并行就有两个CPU在处理。为了让两个进程在单核CPU中也能得到执行,一般的做法就是让每个进程交替执行一段时间,比如让每个进程固定执行 100毫秒 ,执行时间使用完后切换到其他进程执行。而并行就没有这种问题,因为有两个CPU,所以两个进程可以同时执行。如下图: 原子操作 上面介绍过,并发有可能会打断当前执行的进程,然后替切换成其他进程执行。如果有两个进程同时对一个共享变量 count 进行加一操作,由于C语言的 count++ 操作会被翻译成如下指令: mov eax , [ count ] inc eax mov [ count ], eax 那么在并发的情况下,有可能出现如下问题: 假设count变量初始值为0: 进程1执行完 mov eax, [count] 后,寄存器eax内保存了count的值0。 进程2被调度执行。 进程2执行 count++ 的所有指令,将累加后的count值1写回到内存。 进程1再次被调度执行

Java并发指南1:并发基础与Java多线程

亡梦爱人 提交于 2020-12-02 05:53:50
本文转载自互联网,侵删 什么是并发 在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。 随着多任务对软件开发者带来的新挑战,程序不在能假设独占所有的CPU时间、所有的内存和其他计算机资源。一个好的程序榜样是在其不再使用这些资源时对其进行释放,以使得其他程序能有机会使用这些资源。 再后来发展到多线程技术,使得在一个程序内部能拥有多个线程并行执行。一个线程的执行可以被认为是一个CPU在执行该程序。当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序。 多线程比多任务更加有挑战。多线程是在同一个程序内部并行执行,因此会对相同的内存空间进行并发读写操作。这可能是在单线程程序中从来不会遇到的问题。其中的一些错误也未必会在单CPU机器上出现,因为两个线程从来不会得到真正的并行执行。然而,更现代的计算机伴随着多核CPU的出现,也就意味着不同的线程能被不同的CPU核得到真正意义的并行执行。 如果一个线程在读一个内存时,另一个线程正向该内存进行写操作,那进行读操作的那个线程将获得什么结果呢?是写操作之前旧的值?还是写操作成功之后的新值?或是一半新一半旧的值

RCU介绍

蹲街弑〆低调 提交于 2020-12-02 00:54:13
RCU原理:      RCU(Read-Copy Update),顾名思义就是读-拷贝修改,它是基于其原理命名的。对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用一个回调(callback)机制在适当的时机把指向原来数据的指针重新指向新的被修改的数据。这个时机就是所有引用该数据的CPU都退出对共享数据的操作。 因此RCU实际上是一种改进的rwlock,读者几乎没有什么同步开销,它不需要锁,不使用原子指令,而且在除alpha的所有架构上也不需要内存栅(Memory Barrier),因此不会导致锁竞争,内存延迟以及流水线停滞。不需要锁也使得使用更容易,因为死锁问题就不需要考虑了。写者的同步开销比较大,它需要延迟数据结构的释放,复制被修改的数据结构,它也必须使用某种锁机制同步并行的其它写者的修改操作。读者必须提供一个信号给写者以便写者能够确定数据可以被安全地释放或修改的时机。有一个专门的垃圾收集器来探测读者的信号,一旦所有的读者都已经发送信号告知它们都不在使用被RCU保护的数据结构,垃圾收集器就调用回调函数完成最后的数据释放或修改操作。 RCU与rwlock的不同之处是:它既允许多个读者同时访问被保护的数据,又允许多个读者和多个写者同时访问被保护的数据(注意