自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(75)
  • 问答 (1)
  • 收藏
  • 关注

原创 CAS以及其ABA问题及解决方法

1、简述常见的Java并发手段是加锁,但加锁、解锁操作是消耗性能的。相比起来,CAS无锁方案则没有加锁、解锁的性能消耗,还保证了互斥性,但同时也存在ABA的问题2、CASCAS的语义是:将内存位置的值与预期原值比较,如果相匹配,那么处理器会自动将该位置值更新为新值,否则,处理器不做任何操作。CAS是一条CPU的原子指令(cmpxchg指令),是通过Unsafe类的方法实现的,Unsaf...

2019-04-21 18:49:50 639

原创 ThreadLocal

1、简介ThreadLocal提供了一种访问某个变量的特殊方式:访问到的变量属于当前线程,即保证每个线程的变量不一样,而同一个线程在任何地方拿到的变量都是一致的,这就是所谓的线程隔离ThreadLocalMap并不是为了解决线程安全问题,而是提供了一种将实例绑定到当前线程的机制,类似于隔离的效果,实际上自己在方法中new出来变量也能达到类似的效果。ThreadLocalMap跟线程安全基本...

2019-03-02 21:59:20 830 3

转载 《Java并发编程实战》笔记6——notify、notifyAll

  只有同时满足以下两个条件时,才能用单一的notify而不是notifyAll:a.所有等待线程的类型都相同,只有一个条件谓词与条件队列相关,并且每个线程在从wait返回后将执行相同的操作。b.单进单出。在条件变量上的每次通知,最多只能唤醒一个线程来执行。 ...

2018-10-10 12:45:52 282

原创 ReentrantLock、ReentrantReadWriteLock

一、ReentrantLockReentrantLock是可重入锁,已经获得锁的线程可以再次获得锁,如果一个线程获取了n个锁,那么释放的时候同样要释放n个锁。同步组件主要是通过重写AQS的几个protected方法来表达自己的同步语义。ReentrantLock主要的方法: //获取锁 public void lock() { sync.lock(); ...

2018-10-08 22:53:17 241

原创 Lock、AbstractQueuedSynchronizer

一、Lock简介Lock是并发访问共享资源的另一种方式,当需要使用chain lock这种时会很灵活,jdk文档中举了一个例子:(For example, some algorithms for traversing concurrently accessed data structures require the use of "hand-over-hand" or "chain locki...

2018-09-29 10:24:34 220

原创 《Java并发编程实战》笔记5——性能与测试

性能与可伸缩性1、小工具(1)perfar:测试CPU忙碌程度信息(2)iostat、perfmon:判断是否是I/O密集2、单个任务的处理时间不仅包括执行任务Runnable的时间,也包括从共享队列中取出任务的时间。如果通过加锁来保护队列的状态,那么当一个线程从队列中取出任务时,其他需要获取下一个任务的线程就必须等待,这就是任务处理过程中的串行部分。在所有的并发程序中都包含一...

2018-09-25 15:55:04 178

原创 《Java并发编程实战》笔记4——避免活跃性危险

1、死锁(1)锁顺序死锁例子:public class LeftRightDeadlock { private final Object left = new Object(); private final Object right = new Object(); public void leftRight() { synchronized ...

2018-09-21 16:37:15 283

原创 《Java并发编程实战》笔记3——线程池的使用

1、线程饥饿死锁在线程池中,如果任务依赖于其他任务,那么可能发生死锁。在单线程的Executor中,如果一个任务将另一个任务提交到同一个Executor,并且等待这个被提交任务的结果,那么通常会引发死锁。如下面代码所示:public class ThreadDeadlock { ExecutorService exec = Executors.newSingleT...

2018-09-19 12:37:23 186

原创 《Java并发编程实战》笔记2——取消与关闭

1、取消(1)生产者消费者问题中,如果采用BlockingQueue阻塞队列。假如生产者生产的速度超过了消费者的处理速度,队列将被填满,put操作也会被阻塞。当生产者在put方法中阻塞时,如果消费者希望取消生产者任务,它可以通过调用cancel方法来设置cancelled标志,但此时生产者却永远不能检查这个标志,因为它无法从阻塞的方法中恢复过来(消费者已经停止从队列中取出素数,所以put方法将...

2018-09-17 18:06:31 295

原创 《Java并发编程实战》笔记1——Java线程安全基础

1、什么是线程安全?多个线程访问某个类时,不管运行时环境采用何种调用方式或者这些线程将如何交替执行,并且在主调代码中不需要任何的额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。(摘自Java并发编程实战)2、无状态对象一定是线程安全的。那么,什么才称为无状态呢?有状态是指有数据存储的功能,也就是有实例变量。无状态是指不包含任何域,也不包含对其他类中域的引用。(...

2018-09-14 17:13:24 217

原创 Iterator源码解析及和for-each循环

在使用foreach循环遍历集合的过程中,如果集合被修改了,会抛出ConcurrentModificationException异常。以这段代码为例子:public class SynProblem { List<Widget> widgetList = Collections.synchronizedList(new ArrayList<>()); { ...

2018-09-14 17:12:22 273

原创 线程饥饿死锁

/** * 线程饥饿死锁——在单线程Executor中发生死锁 */public class ThreaDeadLock { //单线程Executor ExecutorService exec = Executors.newSingleThreadExecutor(); class RenderPageTask implements Callable<Str...

2018-07-22 22:51:56 300

转载 volatile和final

1、关于内存屏障:(摘自内存屏障)(1)LoadLoad屏障:对于这样的语句Load1; LoadLoad; Load2,在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。(2)StoreStore屏障:对于这样的语句Store1; StoreStore; Store2,在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。(3)Loa...

2018-07-16 15:42:57 570

原创 2. Add Two Numbers

给定两个非空链表代表两个非负整数,每位数存储在一个倒置的链表中结点,将这两个数相加,返回结果链表.你可以假设这两个数字不包含任何前导零,除了数字0本身。ExampleInput: (2 -> 4 -> 3) + (5 -> 6 -> 4)Output: 7 -> 0 -> 8Explanation: 342 + 465 = 807.思路:可以看到链表翻转过...

2018-07-14 15:49:36 176

原创 Python模块笔记

Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。1、导入模块from..import和import..区别在同一路径下新建文件now.py# -*- coding:UTF-8 -*-Money = 2000def AddMoney(a): global Money Money = Money + ...

2018-07-14 09:53:23 369

原创 CountDownLatch和CyclicBarrier

一、CountDownLatchCountDownLatch是拦截线程等待事件发生,提供了一个countDown方法来操作计数器的值,每调用一次countDown方法计数器都会减1,直到计数器的值减为0时就代表条件已成熟,所有因调用await方法而阻塞的线程都会被唤醒。1、下面是java源码的两个demo:(1) /** * * startSignal:司机准备好之前,...

2018-07-10 09:28:37 244

原创 Python基础笔记(实验楼笔记)

1、元组元素不可修改,列表元素可以修改不可删除元组元素,只能删除整个元组,但列表可以2、元组只有一个元素时,需要在元素后面加逗号,如:tup1 = (50,)...

2018-07-02 07:54:18 279

原创 使用文本编辑器编译python出现乱码问题

1、编译如下代码# -*- coding:UTF-8 -*-print "My name is %s and weight is %d kg!" %('Emily',46)print "{1} {0}".format("hello","world")print ("网站名:{name},地址:{url}".format(name="知乎",url='www.zhihu.com'))

2018-06-30 10:26:02 542

原创 2. Add Two Numbers

给定两个非空链表代表两个非负整数,每位数存储在一个倒置的链表中结点,将这两个数相加,返回结果链表.你可以假设这两个数字不包含任何前导零,除了数字0本身。ExampleInput: (2 -> 4 -> 3) + (5 -> 6 -> 4)Output: 7 -> 0 -> 8Explanation: 342 + 465 = 807.思路:可以看到链表翻转过...

2018-06-07 07:26:43 205

原创 1. Two Sum [SIMPLE]

题目:给定一个整型数组,返回数组中两数相加和等于target的下标。假设每次输入只有一个结果,你不会两次都用到同一个元素。1、第一次解法:    通过创建一个和输入数组大小一样的数组,用target-原数组元素nums[i]并依次赋值给help[i],建立一个全新的数组help,只需要通过比较当前元素help[i]与原数组nums[i+1]后面的元素是否相等,即可判断nums[i]+nums[j]...

2018-05-26 15:17:06 204

原创 Netty入门学习

1、传统IO模型是服务器通过死循环来接收客户端的请求,为接收到的客户端请求创建新的线程进行处理。(面向流)2、了解Java NIO(面向缓存区)Java NIO浅析3、一个连接完整的网络处理过程如下:4、了解:Reactor模型Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式5、Netty系列之Netty线程模型6、Netty实现原理浅析7、Netty那点事(1)概述Ne...

2018-05-15 10:11:04 319

转载 Mybatis

参考:mybatis 详解(一)------JDBC

2018-01-24 11:04:57 254

原创 SpringMVC 2.1

1、GET、POST以外的请求处理GET、POST可以直接通过浏览器发送请求,但是HTTP协议里面还有PUT、DELETE之类的请求,浏览器无法直接发送的。浏览器可以通过两种方式发送PUT、DELETE之类的请求:1)使用jQuery,$.ajax({ ... } );①MethodController.java②a.jsp PUT请求 DELETE请求

2018-01-24 10:49:20 264

原创 SpringMVC 1.2

1、请求URL和方法的映射@RequestMapping注解来进行URL和方法的映射可能的情况:①一个类里面,每个方法的URL,没有相同的部分,于是每个方法上面,都各自指定一个URL。②一个类里面,所有的方法,前面部分都是一样的,比如:/user/add、/user/list、/user/view、/user/update此时可以在类上面使用 @RequestMapping

2018-01-21 16:51:55 244

原创 SpringMVC 1.1——入门

第一个项目——HelloWorld1、准备步骤:①新建web项目,复制jar包②配置Spring③配置Web应用在启动时自动创建Spring容器④为第三步的Spring提供配置文件⑤配置web.xml文件,增加DispatcherServlet,这个是SpringMVC的前端控制器。⑥增加一个对应的【servletName-servlet.x

2018-01-20 11:18:35 244

原创 Spring4.2—— Spring的事务控制

1、传统事务控制存在的问题:  持久化技术不同,事务控制的API也会不同,会导致事务控制代码也会随之改变。程序将Service层与DAO分离,目的就是为让Service只负责业务变化,DAO专门负责持久化技术的变化。事务控制代码需要放在Service层完成,持久化技术的改变,必然导致Service组件也要随之修改。2、Spring的事务控制(1)特征:Spring的事务管理不需要与任何

2018-01-03 21:08:46 364

原创 Spring4.1——AOP

1、 AOP框架的分类(按修改的时机来划分)      (1)静态AOP实现:AOP框架在编译阶段即实现对目标类的修改(增强),生成静态的AOP代理类(生成*.class文件已经被改掉了,需要使用特定的编译器)。以AspectJ为代表。      (2)动态AOP实现:AOP框架在运行阶段动态生成AOP代理(在内存中动态地生成AOP代理类:JDK动态代理或cglib),以实现对目标

2018-01-03 16:48:32 341

原创 Spring3.3——Spring注解配置、Spring+Struts2整合、s2sh整合

1、零配置步骤:(1)在配置文件启用“零配置”。        使用元素(2)为Spring Bean添加注解。           @Component:标注一个普通的Spring Bean类。如果不指定id,默认就该类的类名首字母小写作为id。                        @Controller:标注一个控制器组件类。

2017-12-28 15:55:03 468

原创 Struts2——OGNL和ValueStack

值栈是对应每一个请求对象的轻量级的内存数据中心。每一次请求的时候,都会创建一个新的ValueStack对象,该ValueStack对象封装了这一次请求相关的数据信息.

2017-12-26 23:21:53 298

原创 Struts2——文件上传、下载

1、文件上传文件上传准备:注意:    1)表单必须使用POST方式提交(GET方式数据大小不能超过1KB);    2)使用二进制编码.multipart/form-data(把文件的数据发送给服务端而不是文件的名).    3)<inputtype="file" name=""/>eg:①upload.jsp文件上传上传图片: ②Upl

2017-12-26 13:45:04 439

原创 Struts2——拦截器(Interceptor)

拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个Action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也提供了一种可以提取Action中可重用的代码的方式。1、Struts2中内置的拦截器常见的拦截器:(1)params拦截器这个拦截器把请求参数设置到相应的Action的属性去,并自动进行类型转换。 (2)modelD

2017-12-26 09:31:09 470

原创 Struts2 入门

1、原理可参考:http://blog.csdn.net/laner0515/article/details/27692673/ 、 http://blog.csdn.net/wuwenxiang91322/article/details/110705132、第一个项目——HelloWorld步骤:①建立web项目,拷贝struts-2.5.10.1-min-lib/lib

2017-12-23 21:45:47 285

原创 Spring3.2—— BeanPostProcessor、BeanFactoryPostProcessor

▲ Bean后处理器       Bean后处理器,负责对容器中所有的Bean进行某种特定的修改,从而使这批Bean全部获得某种新功能。       Object postProcessBeforeInitialization(Object bean, String beanName):初始化之前执行。       Object postProcessAfterInit

2017-12-22 10:55:28 464

原创 Spring3.1——Spring表达式语言SpEL

创建步骤:     (1)创建ExpressionParser对象。表达式解析器。     (2)调用ExpressionParser对象的parseExpresssion方法解析字符串,得到Expression对象。     (3)调用Expression对象的getValue()方法,即可得到表达式的值。eg1:基本语法eg2:变量语法

2017-12-22 09:48:48 362

原创 Spring2.6高级配置、util简化配置

Spring的本质:通过XML去驱动spring 以反射的方式去执行Java代码。     在Spring配置文件中使用XML元素进行配置,实际上驱动Spring执行相应的代码。例如:      - 使用元素:驱动Spring执行无参数构造器、或有参数的构造器。还可驱动通过工厂方法创建Bean。      - 使用元素:驱动Spring执行setter方法。     Java程

2017-12-15 15:19:51 431

原创 Spring2.5—— Bean的生命周期、作用域不同步的Bean

1、 Spring容器中的Bean主要有singleton Bean和prototype Bean。prototype Bean不存在所有生命周期的概念!singleton Bean两个生命周期行为(1)出生之后:为他配置各种资源。       ①用init-method来指定。       ②实现InitializingBean,该接口中afterPropertiesSet将

2017-12-15 11:20:24 305

原创 Spring2.4——FactoryBean、获取Bean的id

1、FactoryBean——Spring提供的一个特殊接口 FactoryBean接口是工厂Bean的标准接口,实现该接口的Bean通常作为工厂Bean使用,     当我们把工厂Bean部署在容器中、并通过getBean()方法来获取时,容器返回的不是FactoryBean实例,     而是返回FactoryBean的产品(也就是该工厂Bean的getObject方法的返回值)。

2017-12-14 23:14:03 556

原创 Spring2.3——抽象Bean和子Bean

将多个Bean所包含的通用信息提取出来,配置成一个Bean模板——但不希望Spring去创建该bean,于是需要指定【abstractr="true"】——这就是抽象Bean。抽象Bean并不是抽象类,只是配置信息的模板。1、beans.xml配置<bean id="dog" abstract="true"p:age="6"/><bean id="puppy

2017-12-14 22:10:11 492

原创 Spring2.2——实例化Bean的3种方式

1、调用该Bean的实现类的构造器。2、调用工厂类的静态工厂方法。        factory-method:指定工厂方法的名字        class:指定工厂类的类名。        如果工厂方法要参数,请使用来传入参数。3、调用实例工厂的实例工厂方法。        factory-method:指定工厂方法的名字        factory-b

2017-12-14 21:48:36 297

原创 Spring2.1——自动装配、简化配置、嵌套bean、集合

1、自动装配可通过元素的default-autowire属性指定,也可通过元素的autowire属性指定。自动装配可以减少配置文件的工作量,但降低了依赖关系的透明性和清晰性。尽量少用! autowire属性可以接受如下值:            - no:不使用自动装配。Bean依赖必须通过ref元素定义。这是默认的配置。            - byName:根

2017-12-14 21:04:16 613

空空如也

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

TA关注的人

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