java锁机制介绍

java锁 乐观锁与悲观锁 乐观锁与悲观锁都是一种锁机制。用于实现线程同步机制。 悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。适用于数据频繁修改的场景。 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。 java中的锁机制 synchronized 在java5之前,使用关键字synchronized修饰一个方法或者代码块对临界资源的保护实现多线程并发同步。有四种不同的同步块: 实例方法 静态方法 实例方法中的同步块 静态方法中的同步块 synchronized(lockObject) { //需要访问的临界资源 } ReentrantLock Java5 java.util.concurrent.locks 提供了Lock接口。Lock提供了更加灵活的锁实现。写法一般如下: lock.lock(); try { //需要访问的临界资源 } finally { lock.unlock(); } 获取锁的方式: lock() 阻塞持续等待直到获取锁 tryLock() 方式获得锁,默认不阻塞,不等待,如果能够获取锁返回true,可以设置等待时间。 lockInterruptibly() 中断锁, 使用中断锁在等待获取锁的时候,会响应线程中断。 在Java1.5中,synchronized是一个重量级操作,需要调用操作系统相关接口,性能是低效的,有可能给线程加锁消耗的时间比有用操作消耗的时间更多。到了Java1.6,synchronized进行了很多的优化,有适应自旋、锁消除、锁粗化、轻量级锁及偏向锁等,效率有了本质上的提高。在之后推出的Java1.7与1.8中,均对该关键字的实现机理做了优化。 两种锁在低并发的情况下性能都差不多,更推荐使用synchronized,毕竟不用怕忘记在finnaly中执行unlock()。 但在高并发量的条件下,synchronized性能会迅速下降几十倍,因为多了很多自旋锁操作,而ReentrantLock的性能却能依然维持一个水准。 当线程通过synchronized等待锁时是不能被Thread.interrupt()中断的 Semaphore 使用方法与ReentrantLock相似。 acquire()方法默认为可响应中断锁,与ReentrantLock.lockInterruptibly()作用效果一致。 支持多个临界资源,而ReentrantLock只支持一个临界资源 Atom系列原子类 public class AtomicInteger extends Number… Continue reading java锁机制介绍

Published
Categorized as java

java实现move操作

java实现move操作 这类操作与文件所在的文件系统息息相关. File的renameTo一般只用于同级目录修改文件名。 想要多级目录移动文件还得用Files.move方法。 同一个文件系统下会进行move操作 不同文件系统,则通过拷贝-删除的方式实现move。 package io.move; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; /** * move-test<br/> * ├── dir1<br/> * │   └── child<br/> * │   └── hui3<br/> * └── hui1<br/> * <p> * move-test<br/> * ├── dir1<br/> * │   └── child<br/> * │   └── hui3<br/> * └── hui2<br/>… Continue reading java实现move操作

LIBRARY_PATH和LD_LIBRARY_PATH

LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下: LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目录。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录): export LIBRARY_PATH=LIBDIR1:LIBDIR2:$LIBRARY_PATH LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径,注意,LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录): export LD_LIBRARY_PATH=LIBDIR1:LIBDIR2:$LD_LIBRARY_PATH 来自:LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别

kmp匹配字符串

  kmp算法常用于优化字符串匹配,例如下面的问题: 有一个字符串a = “BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串b = “ABCDABD” 一般的做法是循环比较。 func contain(a string, b string) bool { for i := 0; i < len(a); i++ { k := i for j := 0; j < len(b); { if b[j] == a[k] { if j == len(b)-1 { return true } j++ k++ } else {… Continue reading kmp匹配字符串

Published
Categorized as algorithm, go

申请 ssl 证书

教程都在这里:酷壳 如何免费的让网站启用HTTPS 原来用的证书是阿里云上申请的免费Symantec证书,结果发现chrome上提示警告,以后的版本不会再支持。 Google Chrome正式宣布将不再信任赛门铁克所有SSL证书 教程里使用的Let’s Encrypt 是一个于2015年三季度推出的数字证书认证机构,将通过旨在消除当前手动创建和安装证书的复杂过程的自动化流程,並推廣使萬維網服務器的加密連接無所不在,为安全网站提供免费的SSL/TLS证书。 安装cerbot-nginx,运行报错了 urlib3 ImportError: No module named ‘requests.packages.urllib3’ PyOpenssl raise ImportError(“‘pyOpenSSL’ module missing required functionality. ” ImportError: ‘pyOpenSSL’ module missing required functionality. Try upgrading to v0.14 or newer. 网上都是说镜像里的软件版本太低,影响了apache cerbot。 更新系统阿里云镜像为163镜像,再把软件都更新了一遍。 然后用pip又把软件所有软件package更新一遍。 yum remove certbot-nginx -y #更新为163源 cd /etc/yum.repos.d #backup mv CentOS-Base.repo CentOS-Base.repo.bak wget http://mirrors.163.com/.help/CentOS6-Base-163.repo mv CentOS6-Base-163.repo CentOS-Base.repo yum… Continue reading 申请 ssl 证书

Published
Categorized as web