自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 资源 (2)
  • 收藏
  • 关注

原创 重新认识下数据结构与算法(二)数组的排序算法

在我们程序的开发过程中,数据不仅仅只是存储,还经常需要对数据做一定的处理。这就是算法,如果是几百条,几千条甚至几万条的数据的话,可能我们对算法的效率和时间复杂度没那么敏感。但是如果我们面对的是几百万,几千万甚至几亿,几十亿,几百亿的数据的话,那么我们对算法的要求就非常高了。下面就是我们开发中经常用到的算法。1.数组与数组相关的算法很多,但最基本最常见的就是排序的算法(1)冒泡排序冒...

2020-03-18 12:29:35 510

原创 重新认识下数据结构与算法(一)数据结构

1.数据结构是什么?数据结构就是我们设计用来存储数据的一种方式,在程序员眼里就是一种工具。说到数据结构,就要说起算法,那么算法是什么呢?2.算法是什么?算法就是对数据结构中的数据进行的各种各样的处理。比如排序,算中位数,求平均数等等。3.我们常见的数据结构有哪些呢?数组、栈、链表、队列、二叉树、哈希表、堆和图等等都是我们常见的数据结构。在这几种常见的数据结构中,有两个比较特殊,...

2020-03-12 23:09:13 222

原创 详解AbstractQueuedSynchronizer(下)

5.AQS如何释放资源的呢?有获取资源就有释放资源的反过程,这样程序顺利的实现我们想要的效果。那么AQS是如何释放资源的呢?AQS释放资源的方式也分realse(独占释放资源)和realseShared(共享释放资源)两种。(1)realse(释放独占资源) public final boolean release(int arg) { if (tryRelea...

2020-03-09 22:54:00 181

原创 详解AbstractQueuedSynchronizer(上)

AQS是jdk的concurrent包中非常重要也设计得非常好的一个类。AQS是AbstractQueuedSynchronizer的缩写,翻译成中文就是抽象同步队列,之所以这么命名,就是他是实现同步的一个抽象类。所以很多同步工具都是基于他来实现的。ReentrantLock,CountDownLatch,CyclicBarrier,Semaphore这些类也是变量继承AbstractQueu...

2020-03-09 20:50:19 139

原创 Mysql innoDB搜索引擎索引知识(看完这篇你应该知道平时如何去建索引了)

在数据库中我们一般都会创建索引来提高查找的速度,

2020-04-05 16:51:05 696

原创 重新认识下数据结构与算法(四)算法的应用(不定时更新)

1.如何求一个数组中两个数为某个特定值的任意两个数(不重复)解这道题的思想是,我们可以先把数组排个序,然后把最小值和最大值去相加,如果超过了特定值,则说明两个数中必须有一个数要小一点,因为数组已经排过序了,所以最小值不能再往下减了,只能最大值往下减。如果是小于特定值,说明只能最小值往上加了。代码如下: public static List<LongObject> findS...

2020-03-20 23:54:45 148

原创 部署tomcat项目,项目访问不到,报404的问题

如果确信自己的项目没问题的话idea点开编辑配置选择Deployment,修改Application context的路径再点击Server你会发现已经变成你想要的路径了,然后访问项目时通过url加下@RequestMapping的路径就能够访问了。...

2020-03-12 12:22:18 2794

原创 软件设计的几个原则

一、软件设计的目标?一个好的软件设计的两大目标是:复用率高,可维护性好。二、如何设计出一个复用率高、可维护性好的软件系统?这里有一些设计的原则1.“开-闭”原则2.里氏代换原则3.依赖倒转原则4.接口隔离原则5.组合/聚合复用原则6.迪米特原则三、“开-闭”原则(OCP)1.什么是“开-闭”原则?一个软件实体应当对扩展开放,对修改关闭。...

2019-11-27 18:45:54 1164 1

原创 Java高并发情况下一些类的使用

一、Random与ThreadLocalRandom每个Random实例里面都有一个原子性的种子变量用来记录当前的种子值,当要生成新的随机数时需要根据当前种子计算新的种子并更新回原子变量。在多线程下使用单个Random实例生成随机数时,当多个线程同时计算随机数来计算新的种子时,多个线程会竞争同一个原子变量的更新操作,由于原子变量的更新是CAS操作,同时只有一个线程会成功,所以会造成大量线程进行...

2019-11-20 18:26:29 333

原创 ThreadLocal

多线程访问同一个共享变量时特别容易出现并发问题,特别是在多个线程需要对一个共享变量进行写入时。为了保证线程安全,一般使用者在访问共享变量时需要进行适当的同步。同步的措施一般是加锁,这就需要使用者对锁有一定的了解,这显然加重了使用者的负担。那么有没有一种方式可以做到,当创建一个变量后,每个线程对其进行访问的时候访问的是自己线程的变量呢?其实ThreadLocal就可以做这件事情,虽然Thread...

2019-11-18 14:32:16 127

原创 线程池的创建

1.为什么要用线程池线程池主要解决两个问题:一是当执行大量异步任务时线程池能够提供较好的性能。在不使用线程池时,每当需要执行异步任务时直接new一个线程来运行,而线程的创建和销毁是需要开销的。线程池里面的线程是可复用的,不需要每次执行异步任务时都重新创建和销毁线程。二是线程池提供了一种资源限制和管理的手段,比如可以限制线程的个数,动态新增线程等。每个ThreadPoolExecutor也保留...

2019-11-18 10:16:35 116

原创 线程基础知识(二)

1.线程通知与等待(1)wait()函数当一个线程调用一个共享变量的wait()方法时,该调用线程会被阻塞挂起,直到发生下面几件事情之一才返回:1.其他线程调用了该共享变量的notify()或者notifyAll()方法;2.其他线程调用了该线程的interrupt()方法,该线程抛出InterruptedException异常返回。另外需要注意的是,如果调用wait()方法的线程没有...

2019-11-13 11:01:58 157

原创 线程基础知识(一)

1.什么是线程进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源。操作系统在分配资源时是把资源分配给进程的,但是CPU资源比较特殊,它是被分配到线程的,因为真正要占用CPU运行的是线程,所以也说线程是CPU分配的基本单位。在Java中,当我们启动main函数时其实就启动了一个JV...

2019-11-12 14:28:34 147

原创 Java并发包中并发队列

JDK中提供了一系列场景的并发安全队列。按照实现方式的不同可分为阻塞队列和非阻塞队列,前者使用锁实现,后者使用CAS非阻塞算法实现。相比阻塞算法,CAS算法使用CPU资源换取阻塞所带来的开销。一、ConcurrentLinkedQueueConcurrentLinkedQueue是线程安全的无界非阻塞队列,其底层数据结构使用单项链表实现,对于入队和出队操作使用CAS来实现线程安全。Co...

2019-11-11 19:43:12 318

原创 Mysql中InnoDB存储引擎索引

1.索引是什么:索引用于快速找出在某个列中有某一特定值的行。2.索引的优缺点:优点:索引能够有效地提高查询的效率;缺点:索引过多也会影响应用程序的性能。3.索引的分类:按索引包含列的个数可以分为(1)单列索引(一个索引只包含一个列,但一个表可以有多个单列索引)(2)组合索引(一个组合索引包含两个或者两个以上的列)只有在查询条件中使用了这些字段的左边字段时,索引才...

2018-12-23 13:44:41 555

原创 Mysql锁

锁是什么?锁是数据库系统区别于文件系统的一个关键特性。锁机制用于管理对共享资源的并发访问。数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性。InnoDB存储引擎中的锁锁的类型?InnoDB存储引擎实现如下两种标准的锁共享锁(S Lock),允许事务读一行数据排他锁(X Lock),允许事务删除或更新一行数据如果一个事务T1已经获得了行r的共享锁...

2018-12-23 13:32:41 173

原创 看透SpringMVC源代码分析与实践(三)

一、SpringMVC之初体验SpringMVC最简单的配置       (1)在web.xml中配置Servlet         (2)   创建Controller和view         (3)   创建SpringMVC的xml配置文件 二、创建SpringMVC之器SpringMVC中核心Servlet的继承结构如下图所示:GenericServle...

2018-12-23 13:21:04 467

原创 看透SpringMVC源代码分析与实践(二)

一、Tomcat的顶层结构及启动过程1.Tomcat的顶层结构       Tomcat中最顶层的容器叫Server,代表整个服务器,Server至少包含一个Service用于具体的服务。Service主要包含两部分,Connector和Container。Connector用于处理连接相关的事情,并提供Socket与request、response的转换,Container用于封装和管理...

2018-12-23 12:59:32 223

原创 看透SpringMVC源代码分析与实践(一)

一、网站架构及其演变过程 1.软件的三大类型         软件分为三个类型:单机软件、BS结构的软件(浏览器-服务端)、CS结构的软件(客户端-服务端)。2.BS的基础结构         BS的网络传输的分解方式有两种:一种是标准的OSI参考模型,另一种是TCP/IP模型。它们的分层和对应的关系如下图所示。         OSI主要用于教学,TCP/IP主要有四...

2018-12-23 12:46:12 431

原创 JAVA基础知识--代理的基本了解

代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式,即通过代理对象来访问目标对象。这样的好处是:可以在目标对象实现的基础上面,增加额外的功能操作,即扩展目标对象的功能。代理的方式主要有三种:1.静态代理:静态代理在使用时需要定义接口或者父类,被代理对象和代理对象一起实现相同的接口或者是继承相同的父类。需要注意的是,代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来调...

2018-09-05 09:34:57 163

原创 JAVA一些基本知识总结

自增、自减运算符是单目运算符,可以放在操作元之前,也可以放在操作元之后。操作元必须时一个整型或浮点型变量。自增、自减运算符的作用是使变量的值增1或减1。放在操作元前面的自增、自减运算符,会先将变量的值加1(减1),然后再使该变量参与表达式的运算。放在操作元后面的自增、自减运算符,会先使变量参与表达式的运算,然后再将该变量加1(减1)。例如:++a   //表示在使用变量a之前,先使a的值加1...

2018-08-27 23:15:30 104

原创 JAVA集合框架

Java集合框架主要分为collection 和map两个类型的容器。collection主要由List,Set,Queue三个接口直接继承。一、List是有序的元素可重复的:List下面有个抽象的类 AbstractList,AbstractList抽象类实现了List这个接口。Vector,ArrayList和  LinkedList这三个类是List接口的最终实现类。二、Set是...

2018-08-10 17:17:47 119

原创 聊聊String,StringBuffer,StringBuilder

一个萝卜一个坑(面试遇到的坑)1.String 能不能被继承呢?从没见过String被继承过,那String就是不能被继承了,为什么不能被继承呢,因为String是由final关键字修饰的,final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写;注:实例变量也可以定义为final,被定义为final的变量不能被修改。被声明为final类的...

2018-08-08 17:05:04 201

原创 分布式事务

一、本地事务和分布式事务的区别:本地事务只用于处理单一数据源事务(比如单个数据库),分布式事务可以处理多种异构的数据源,比如某个业务操作中同时包含了JDBC和JMS或者某个操作需要访问多个不同的数据库。二、为什么需要分布式事务:因为分布式系统在与数据库连接时连接了不同的数据库,采用不同的connection对象,无法保证多个connection事务的一致性,会导致数据出现不一致,所以需要分布式...

2018-07-30 09:59:07 300

原创 多线程学习 目录

终于啃完多线程这块“硬骨头”了,但是学到的还是一些皮毛,大部分还是不够深入。以下总结了多线程学习的一些学习文章,借鉴了许多大佬的文章,如果有侵权请联系我删除,如果我对知识有陈述不正确的地方,还劳烦各位大佬赐教。多线程理解(一) 三大特性多线程理解(二) JVM多线程理解(三) JMM(java内存模型)多线程理解(四) 线程多线程理解(五) 线程安全性CAS和原子类多线...

2018-07-27 11:28:10 364

原创 多线程理解(十三) 死锁

一、什么是死锁:通俗的说,死锁就是两个或者多个线程,相互占用对方需要的资源,而都不进行释放,导致彼此之间都相互等待对方释放资源,产生了无限制等待的现象。死锁一旦发生,如果没有外力介入,这种等待将永远存在,从而对程序产生严重影响。线程死锁可能发生在以下的情况:当两个线程相互调用Thread.join(); 当两个线程使用嵌套的同步块时,一个线程占用了另一个线程的必需的锁,互相等待时被阻塞,...

2018-07-27 11:18:32 288

原创 多线程理解(十二) 线程池

一、为什么使用线程池:1.new Thread的缺点:(1)每次new Thread 新建对象,性能差(2)线程缺乏统一管理,可能无限制的新建线程,相互竞争,可能占用过多的系统资源导致死机或者OOM(out of memory 内存溢出),这种问题的原因不是因为单纯的new一个Thread,而是可能因为程序的bug或者设计上的缺陷导致不断new Thread造成的。(3)缺少更多功...

2018-07-27 11:15:33 216

原创 多线程理解(十一) 并发容器J.U.C AQS组件

一、AQS是什么:AQS全名是AbstractQueuedSynchronizer,是并发容器J.U.C(java.lang.concurrent)下locks包内的一个类。它实现了一个FIFO(FirstIn、FisrtOut先进先出)的队列。底层实现的数据结构是一个双向列表。Sync queue:同步队列,是一个双向列表。包括head节点和tail节点。head节点主要用作后续的调度。...

2018-07-26 22:50:53 246

原创 多线程理解(十) 并发容器

一、为什么要使用并发容器:同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低。因此Java5.0开始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了java.util.concurrent包。并发容器主要解决了两个问题:根据具体场景进行设计,尽量避免synchronized,提供并发性。 ...

2018-07-26 22:39:35 510

原创 多线程理解(九) 同步容器

一、线程不安全的类:如果一个类的对象可以同时被多个线程访问,并且不做特殊的同步或并发处理,那么它就很容易表现出不安全的现象。比如抛出异常,逻辑处理错误。1.StringBuilder与StringBufferStringBuilder是线程不安全的,StringBuffer是线程安全的。StringBuffer的方法使用了synchronized关键字修饰。2.ArrayList,...

2018-07-26 22:02:02 200

原创 多线程理解(八) 线程间的通信

一、线程间的通信:就是线程与线程间的相互通知机制。二、线程通信的方法:thread.join();object.wait();object.notify();CountDownLacth;CyclicBarrier;FutureTask;Callable;1.假设有两个线程,一个是线程 A,另一个是线程 B,两个线程分别依次打印 1-3 三个数字即可,代码如下:public ...

2018-07-25 23:56:34 346

原创 多线程理解(七) 线程同步

一、线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作。二、为什么要线程同步:java允许多线程对共享资源进行操作,这样 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用, 从而保证了该变量的唯一性和准确性。三、线程同步的方法:同步方法:即有关键字...

2018-07-25 23:46:37 225

原创 多线程理解(六) 线程封闭

一、什么是线程封闭:就是把对象封闭到一个线程里,只有这一个线程能够看到此对象。那么就算是这个对象不是线程安全的也不会出现不安全的问题,这就是线程封闭。二、实现线程封闭的方法:        1.Ad-hoc线程封闭这是完全靠实现者控制的线程封闭,他的线程封闭完全靠实现者实现,是最糟糕的一种线程封闭。        2.栈封闭栈封闭是我们最经常遇到的一种线程封闭。栈封闭就是指局部...

2018-07-25 23:43:07 275

原创 多线程理解(五) 线程安全性CAS和原子类

一、锁的策略:多线程编程中,我们有时候会认为共享资源大部分时间只会被一个线程所独占,这是一种乐观的想法;有时候我们会认为共享资源在很长一段时间会被多个线程争夺,这是一种悲观的想法。这两种派系映射到并发编程中就如同加锁与无锁的策略,即加锁是一种悲观策略,无锁是一种乐观策略。而无锁总是假设对共享资源的访问没有冲突,线程可以不停执行,无需加锁,无需等待,一旦发生冲突,无锁策略可以采用一种名为CAS的技术...

2018-07-24 17:26:22 2201 1

原创 多线程理解(四) 线程

一、线程:线程是程序中一个单一的顺序控制流程。二、线程的状态:初始(NEW):新建了一个线程,但是还没有调用start(),这时候就是初始状态; 运行(RUNNABLE):JAVA线程中将就绪(ready)和运行中(running)两种状态统称为“运行”。线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程处于可运行线程池中,等待被线程调度选中,获取cpu的使用权,此时...

2018-07-24 17:17:43 159

原创 多线程理解(三) JMM(java内存模型)

JMM是什么:是一种规范,规范了虚拟机与计算机内存是 如何协同工作的。规定了一个线程如何和何时可以看到由 其他线程修改过后的共享变量的值,以及在必须时如何同 步的访问共享变量。 为什么要定义JMM模型:为了屏蔽各种硬件和操作系统 内存访问的差异,以实现让java程序在各种平台下都实现 一致的并发效果。 JVM内存分配的概念:JVM内存分配的两个概念,一个是堆(Heap),一个是栈(Sta...

2018-07-21 23:02:33 412

原创 多线程理解(二) JVM

一、JVM介绍:介绍线程内存模型之前,先介绍下JVM运行时的数据区是如何划分的。Java虚拟机在运行程序时会把其自动管理的内存划分为以上几个区域,每个区域都有的用途以及创建销毁的时机,其中蓝色部分代表的是所有线程共享的数据区域,而绿色部分代表的是每个线程的私有数据区域。1.Method Area方法区方法区是被所有线程所共享的,所有的字段和方法的字节码,以及一些特殊方法如构造函数,...

2018-07-20 18:04:56 279

原创 多线程理解(一)  三大特性

进程、线程和多线程的定义。进程:是指一段具有某种独立功能的程序关于某个数据集合的一次运行活动(一段程序的执行过程)。 线程:单个进程执行中的每个任务就是一个线程。 多线程:在一个进程中有多个线程共享进程资源,执行任务。 多线程的三大特性:原子性:线程的一个或者多个操作要么全部执行,而且执行过程不会被打断,要么全部都不执行。 可见性:可见性是指多个线程访问同一个变量的时候,一个线...

2018-07-19 17:47:43 2850

算法穷举法和动态分析法

上课PPT并不是源代码,如果需要才下载,也包括一部分代码

2015-06-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除