最近在做一个单点登录的系统整合项目,之前我们使用控件实现单点登录(以后可以介绍一下)。但现在为了满足客户需求,在不使用控件情况下实现单点登录,先来介绍一下单点登录。单点登录:多个不同系统整合到统一加载个平台,用户在任何一个系统登录后,可以访问这个统一加载上的所有系统。登录之后,用户的权限和信息不再受某个系统的限制,即使某个系统出现故障(包括统一加载平台),其他系统还是能正常使用的。这就需要用户权限等信息保存到客户端,不受服务器的限制。在cookie相关文档信息中,提到cookie是不能跨域访问的,但是在二级域名是可以共享cookie的。这样就是我们的项目有了局限性,必须将多个系统的域名统一,作为二级域名,统一平台提供使用主域名。这样就可以实cookie的单点登录了。
domain属性:例如设成".xigua.com"则在.xigua.com下的所有服务器下的文件都可以调用cookie.统一平台域名:www.xigua.com统一加载平台和各子系统都是不同的服务器,统一加载平台提供登录认证服务,在统一加载平台认证系统上登录后,用户都可以被其他的系统识别.
(1):Vector是线程安全的,源码中有很多的synchronized可以看出,而ArrayList不是。导致Vector效率无法和ArrayList相比;
(2):ArrayList和Vector都采用线性连续存储空间,当存储空间不足的时候,ArrayList默认增加为原来的50%,Vector默认增加为原来的一倍;
(3):Vector可以设置capacityIncrement,而ArrayList不可以,从字面理解就是capacity容量,Increment增加,容量增长的参数。
并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求。
ConcurrentHashMap的设计与实现非常精巧,大量的利用了volatile,final,CAS等lock-free技术来减少锁竞争对于性能的影响.ConcurrentHashMap采用了分段锁的设计,只有在同一个分段内才存在竞态关系,不同的分段锁之间没有锁竞争。相比于对整个Map加锁的设计,分段锁大大的提高了高并发环境下的处理能力。但同时,由于不是对整个Map加锁,导致一些需要扫描整个Map的方法(如size(), containsValue())需要使用特殊的实现,另外一些方法(如clear())甚至放弃了对一致性的要求(ConcurrentHashMap是弱一致性的
信号量是用来解决线程间同步或互斥的一种机制,也是一个特殊的变量,变量的值代表着当前可以利用的资源。
信号量的本质是数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识。信号量在此过程中负责数据操作的互斥、同步等功能。为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。其中共享内存的使用就要用到信号量。
单表distinct
多表group by, group by 必须放在 order by 和 limit之前,不然会报错
RESTful风格是一种架构思想,而不是接口设计指南。RESTful以资源、状态转移等为核心概念来对业务建模及架构设计,适用于基于互联网的分布式系统,平时大家常说的接口地址要使用名词之类的规定只是为了体现资源的概念。与非RESTful相比,在可用性,稳定性,尤其是可扩展性等方面有很大优势。http协议就是RESTful的典型实现
1) start: 用 start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
2) run: run() 方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待 run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。总结:调用start方法方可启动线程,而run方法只是thread的一 个普通方法调用,还是在主线程里执行。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void.。 两种方式的比较 : 实际中往往采用实现Runable接口,一方面因为java只支持单继承,继承了Thread类就无法再继续继承其它类,而且Runable接口只有一个run方法;另一方面通过结果可以看出实现Runable接口才是真正的多线程
1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
2. 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。
3. 使用interrupt方法中断线程。
1)pre-clean:执行清理前需要完成的工作
2)clean:清理上一次构建生成的文件
3)post-clean:执行清理后需要完成的工作
1)validate:验证工程是否正确,所有需要的资源是否可用。
2)compile:编译项目的源代码。
3)test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。
4)Package:把已编译的代码打包成可发布的格式,比如jar。
5)integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。
6)verify:运行所有检查,验证包是否有效且达到质量标准。
7)install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用。
8)Deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。
1)pre-site:生成项目站点之前需要完成的工作
2)site:生成项目站点文档
3)post-site:生成项目站点之后需要完成的工作
4)site-deploy:将项目站点发布到服务器
逆风TO 发表于 2018-5-24 16:39
给力给力 赞赞赞
大晨晨 发表于 2018-5-28 13:13
感谢分享,楼主加油,祝一帆风顺,步步高升
yy1134787753 发表于 2018-5-28 14:17
给力,6666
小西西哦 发表于 2018-5-28 15:00
666666666666666666666666666
小西西哦 发表于 2018-5-28 15:00
666666666666666666666666666
小西西哦 发表于 2018-5-28 15:00
666666666666666666666666666
mydorling11 发表于 2018-5-28 15:38
driverdriverdriverdriver
JavaEE风清扬 发表于 2018-5-28 16:07
这真是好级了...........
仙人掌sandy 发表于 2018-5-28 16:11
干货呀,辛苦啦
小航子 发表于 2018-5-28 16:40
感谢分享,楼主加油,祝一帆风顺,步步高升
#风萧萧# 发表于 2018-5-28 17:03
谢谢楼主,辛苦了...........
章鱼顶呱呱 发表于 2018-5-28 17:14
hahahahhahahahahahhah
章鱼顶呱呱 发表于 2018-5-28 17:14
hahahahhahahahahahhah
章鱼顶呱呱 发表于 2018-5-28 17:14
hahahahhahahahahahhah
章鱼顶呱呱 发表于 2018-5-28 17:14
hahahahhahahahahahhah
章鱼顶呱呱 发表于 2018-5-28 17:14
hahahahhahahahahahhah
章鱼顶呱呱 发表于 2018-5-28 17:14
hahahahhahahahahahhah
SharkSSB 发表于 2018-5-28 17:44
感谢分享.............
little_superman 发表于 2018-5-28 18:05
666666666666666666
superbaby 发表于 2018-5-28 18:13
不错, 不错 ...........
温柔一刀!喵! 发表于 2018-5-28 18:24
哇哇哇,好厉害!
温柔一刀!喵! 发表于 2018-5-28 18:24
哇哇哇,好厉害!
温柔一刀!喵! 发表于 2018-5-28 18:24
哇哇哇,好厉害!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |