- 博客(27)
- 收藏
- 关注
原创 不用synchronized和lock,实现线程安全的单例模式
总结:单例模式必然会被多个线程访问。多线程访问一定要注意锁的问题。参考博主之前分享的转载文章《java中的锁》,有几种方式如下:自旋锁类锁和对象锁共享锁和排它锁偏向锁互斥锁闭锁活锁分段锁无锁无状态编程线程本地存储volatileCAS协程不使用synchronized和lock这两种工具,但仍可以参考其他方案:无状态编程:不适用线程本地存储:例如lock
2017-02-27 13:45:45 4417
转载 java之IOC原理理解和框架实现
总结:IOC即依赖注入,IOC常见的注入形式有三种:构造函数时注入,set方法注入,调用真正的业务函数时以入参注入(最原始的方法)下文对于IOC的注入原理和方式讲的比较清晰了,这里再补充一种注入框架:包括使用自定义注解标记欲注入的属性,根据注解注入的机制实现。自定义注解标记欲注入的属性:首先需要定义一个注解例如MyIOC,然后在类中需要注意的属性上标记@MyIOC,然后添加se
2017-02-24 15:10:49 10528 1
转载 JAVA之动态代理,静态代理和CGLIB
总结:静态代理:最简单,首先要有接口,然后new实际类A,并将指针转为接口传给proxy,proxy实现了接口,在每个函数内部的before和after执行代理代码后,再调用传入的A的接口函数。使用时,使用proxy类的接口指针。动态代理:不用专门实现一个具体的proxy类。实现一个通用类即可,内部使用getProxyClass(目标类的loader, 目标类的interfaces)函
2017-02-22 16:53:38 1745
转载 JAVA之伪共享
总结:当多个CPU时,访问同一段代码并缓存时,可能在每个CPU的本地缓存都维护该代码数据的缓存行,之间需要进行同步。尤其是,CPU1修改了包含数据X的缓存行R1后,需要告诉同样包含X的CPU2的缓存行R2需要更新,使用RFO消息通信,相当于多CPU通过总线同步了,影响效率!为了避免这种情况,尽量让不同CPU同一时间访问的资源在代码数据中能被划分为不同的缓存行,避免属于同一个缓存行导致R
2017-02-21 13:46:08 280
转载 java之CPU缓存
总结:CPU处理时是依次从L1,L2,L3,物理内存中取数据。如果该层没找到就找下一层,访问速度逐步降低。Lx中是按行进行缓存的,即缓存行,是最小访存单位,类似磁盘一个(扇区?)。所以,如果大部分相关数据都在一个缓存行(通常64字节)中,访问一次就可以获取到所有的数据。提高性能如何将相关数据都放到一个缓存行?这就需要分析缓存行是怎么存数据的:按照加载顺序,例如将相关代码都放到一个数组,
2017-02-21 13:40:44 419
转载 JAVA与尾递归
总结:对于递归,每次调用都会新分配一个栈,因为调用结束后可能要继续执行原来的代码,原来的栈现场必须保留。尾递归的标准:如果函数中所有的递归调用一定是该路径的最后一步,且,改递归函数返回后直接在当前函数返回,不需要再使用当前函数的数据做额外操作(即,所有用到的数据都传入了递归函数,而不是在递归函数返回后做一些运算处理)。由于尾递归要求所有递归返回值直接在外层函数返回,不需要使用外层函数的
2017-02-21 11:25:43 779
转载 JAVA守护线程 非守护线程
笔记:第一篇转载写的比较好,将守护线程同linux的守护进程概念进行了对比。当非守护线程执行完jvm就退出,不管是否还有守护线程在执行。所以守护线程尽量不要执行逻辑代码,顶多执行一些可有可无的辅助性代码。什么东西作为守护线程,还是不太明确?第二篇举了一个实际例子,可以加深理解。以下转载自:http://blog.csdn.net/basycia/article/deta
2017-02-21 10:35:19 3342
转载 死锁实现和怎样分析死锁
总结:最简单的死锁是:线程A持有锁1申请锁2,同时线程B持有锁2申请锁1。-------如果两个线程申请顺序一致,释放顺序同申请顺序也一致,是不会死锁的。使用visualvm查看死锁:首先会提示发现死锁,然后点击“线程dump”查看blocked或者wait的线程,其中Locked ownable synchronizers:表示当前线程持有的锁资源,parking to wa
2017-02-21 09:54:49 467
转载 Unity3D协程介绍 以及 使用
总结:协程允许将代码的各个部分依次分配到不同的连续时间帧中执行,具体方式是:帧U1时,首次进入代码,一直执行,直到yield return代码,释放执行指针PC。当帧U2时,从上次释放的下一句代码进入代码,一直执行........同时,在多次从时间帧进入代码时,之前的局部变量仍然可以访问。猜测实现形式:在每个时间帧的固定函数例A中注册了handler+=协程。然后每次先遍历handle
2017-02-20 20:43:14 827
原创 java之sleep, wait, notify, notifyall
Sleepsleep语义:放弃CPU资源,并告诉操作系统未来N时间内不参与CPU资源竞争。由于是竞争,所以超过N时间,也可能仍竞争不到。sleep不释放资源锁:如果持有锁,则sleep时仍然持有。sleep可以被中断唤醒。sleep(0)语义:告诉系统重新进行一次CPU资源竞争,自己仍可能抢占到CPU资源。缺点是频繁执行会耗费大量CPU时间,优点是适当使用可以提高系统总体响应性能。
2017-02-20 11:41:10 597
转载 lock与synchronized的比较
整理自http://blog.csdn.net/chengguotao/article/details/50498090?locationNum=2&fps=1:Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果
2017-02-20 10:05:05 197
原创 eclipse中导入tomcat源码的配置流程(附版本号和错误解决)
配置ant官网下载ant:http://ant.apache.org/ 并将ant对应目录配置到环境变量注意: 1.10和1.9版本均可。作者采用的是1.10. 下载tomcat源码官网下载源码:http://tomcat.apache.org/注意:如果下载的是tomcat 7,那么在ant build时,必须配置JAVA环境为JDK6
2017-02-17 11:44:35 915
转载 Tomcat 7服务器线程模型
笔记:很标准的一个服务器线程模型,先记录下来。可以用于后续分析理解设计tip。网上的tip:Poller线程用来轮询Selector,这样的好处就是:在没有请求数据时,只有极少数的Poller线程阻塞,而避免了直接使用多个Work线程阻塞的消耗。------------那么没有数据时,worker线程不阻塞在做什么?这种方式,worker相当于被动接收信息,那就还需要一个同步切入点,怎
2017-02-16 10:51:16 305
转载 Java中的锁
笔记:偏向锁(避免自己不断lock或者unlock获取同步块的开销):假设当前线程A在不断lock或者unlock过程中,没有任何其他线程获取该锁。则实际上不需要同步。即A第一次获取锁是使用CAS标记当前线程ID为自己,然后后续都不需要同步。如果线程B也需要获取该锁,首次时检查当前线程ID不是自己,会标记。当到达安全点???(此时,没有正在执行的字节码??线程B将当前线程ID标记为
2017-02-15 15:21:30 809
转载 什么才是真正的 RESTful 架构?
笔记:一个资源有且仅可对应一个实际物理上的存储项,一个存储项可以对应多个资源。对于某个存储项的多步骤操作,可以尝试用多个资源分别表示,而不是用批操作?对于第三级,学习使用返回“key:链接”作为路径指引的重要意义:第一个意义,做到了服务的动态发现,避免客户端预处理或预编码:即客户端不需要记忆或预先从去他渠道获取每个目标的地址,只需要记住几个或者说一个serviceprovider,例如
2017-02-14 10:26:37 1112
转载 解释一下关系数据库的第一第二第三范式?
以下转载自:https://www.zhihu.com/question/24696366解释一下关系数据库的第一第二第三范式作者:刘慰链接:https://www.zhihu.com/question/24696366/answer/29189700来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。国内绝大多数院校用的王珊的《数
2017-02-13 15:52:06 727
转载 十个免费的 Web 压力测试工具
想偷懒就用apache benchmark以下转载自:http://www.oschina.net/news/30374/10-free-tools-to-loadstress-test-your-web?from=rss本文列举了是十个免费工具,可以用来进行Web的负载/压力测试的。这样你就可以知道你的服务器以及你的WEB应用能够扛得住多少的并发量,以及网站性
2017-02-13 10:16:48 249
转载 Java线程池
以下转载自:http://www.cnblogs.com/zhujiabin/p/5404771.html介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用。本文是基础篇,后面会分享下线程池一些高级功能。1、new Thread的弊端执行一个异步任务你还只是如下new Thread吗?new Thread(new Runn
2017-02-10 11:40:53 399
转载 同步屏障CyclicBarrier
笔记:类似CountDownLatch都是实现同步,但CountDownLatch是专门用一个控制线程调用await来同步。而CyclicBarrier是业务线程自己调用await来同步,不需要控制线程。此外,CyclicBarrier还支持reset功能。以下转载自:http://ifeve.com/concurrency-cyclicbarrier/
2017-02-09 14:25:48 179
转载 什么时候使用CountDownLatch
总结:主要是为了同步用,例如,多条分支线程收束到一个节点,然后又从这个节点发散出多个分支线程。这个节点就适合用CountDownLatch。以下转载自:http://www.importnew.com/15731.html本文由 ImportNew - 张涛 翻译自 howtodoinjava。欢迎加入翻译小组。转载请见文末要求。正如每个
2017-02-09 13:47:58 188
转载 java多线程之Semaphore信号量详解
总结:语义:信号量语义是允许多个线程同时申请一定数量的资源信号。从这个角度,同readlock很像。此外,同一个线程可以多次获得信号,但必须释放对应次数,即也允许重入,和reentrantreadlock很像。但是,没有读写锁的互斥判断逻辑。所以内部实现同重入读写锁类似,只是省去了读写锁互斥判定的逻辑。只提供room内人数的check功能,不提供room内变量的互斥操作支持:信号量只是
2017-02-09 10:07:08 378
转载 基于计算机视觉的无人驾驶感知系统
以下转载自:http://geek.csdn.net/news/detail/93514本文是无人驾驶技术系列的第三篇,着重介绍基于计算机视觉的无人驾驶感知系统。在现有的无人驾驶系统中,LiDAR是当仁不让的感知主角。但是由于LiDAR的成本高等因素,业界有许多是否可以使用成本较低的摄像头去承担更多感知任务的讨论。本文探索了基于计算机视觉的无人驾驶感知方案。首先,验证一个方案是否可行需要一
2017-02-09 08:43:57 1408
原创 java多线程编程-ReentrantReadWriteLock笔记
总结两类核心数据结构:第一,针对已经申请到锁的线程的数据结构,记录已经持有的锁数目(重入);第二,针对正在申请中阻塞的线程,会根据先后顺序记录。对于第一类数据结构,主要是exclusive排它锁计数器和share共享锁计数器,前者对应写锁,后者对应读锁。系统实现上,将两类计数器保存在一个32位变量中,高16位和低16位分别对应读锁和写锁,使用Sync内部类的位操作函
2017-02-08 14:30:05 196
转载 【JUC】JDK1.8源码分析之ReentrantLock
这篇博文的特点是绘制了一套复杂场景每个关键帧的状态图,形象清晰, 便于验证理解。以下转载自:http://www.cnblogs.com/leesf456/p/5383609.html一、前言 在分析了AbstractQueuedSynchronier源码后,接着分析ReentrantLock源码,其实在AbstractQueuedSynchronizer
2017-02-07 08:42:50 379
原创 java多线程编程-ReentrantLock笔记
总纲:分为里那个大块,lock和unlock。对于lock,又分为尝试加锁逻辑和队列操作阻塞逻辑。基础知识:原子操作函数CAS:compareAndSet(int expect, int update)setState(int value)getState()基础知识:park和unpark:
2017-02-06 21:03:08 232
原创 tango+unity的sdk中experimental三维重建项目源码解析(一)
主要涉及两个cs文件:TangoDynamicMesh.cs和Tango3DReconstruction.cs由于是第一篇,就不一一分析代码,只介绍两点:1.核心交互2.unity的render显示绑定方式(还不确定)核心交互tango系统会周期调用OnTango3DReconstructionGridIndicesDirty将识别出的三维模型以grid
2017-02-04 21:42:46 2166
转载 java.util.concurrent.Callable, Runnable, Future,ExecutorService介绍
常见流程: ExecutorService executorService = Executors.newCachedThreadPool(); executorService.submit入参和返回值(以下四选一)入参callable,返回futue + future.get有返回值入参runnable,返回future + future.get返回null入参n
2017-02-03 11:07:43 323
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人