- 浏览: 33893 次
最新评论
文章列表
ReentrantReadWriteLock
- 博客分类:
- 多线程
读写锁的例子,半个ConcurrentHashMap
class RWDictionary {
private final Map<String, Data> m = new TreeMap<>();
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();
public Data ...
ReadWriteLock读写锁
- 博客分类:
- 多线程
public interface ReadWriteLock {
/**
* Returns the lock used for reading.
* 返回一个读锁
* @return the lock used for reading
*/
Lock readLock();
/**
* Returns the lock used for writing.
* 返回一个写锁
* @return the lock used for writing
*/
...
ReentrantLock互斥锁
- 博客分类:
- 多线程
public class ReentrantLock implements Lock, java.io.Serializable {
private static final long serialVersionUID = 7373984872572414699L;
// 内部类
private final Sync sync;
//sync继承同步器,并生成模版
abstract static class Sync extends AbstractQueuedSynchronizer {
...
public interface Lock {
// 获取锁。调用该方法当前线程将会获取锁。当锁获取后,从该方法返回
void lock();
// 可中断的获取锁,和lock()方法的不同之处在于该方法会响应中断,既在锁的获取中可以终端当前线程
void lockInterruptibly() throws InterruptedException;
// 尝试非阻塞的获取锁,调用该方法后立即返回,如果能够获取则返回true,否则返回false
boolean tryLock();
//超时的获取锁,当前县 ...
双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子类加载器才会尝试自己去加载。
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized ...
类的加载主要是把二进制文件转换为class对象 对于一个类来讲,加载主要根据双亲委派模型,保证了相等性. 数组加载直接在虚拟机中进行,不通过类记载其创建。
类的初始化和对象的初始化时不同的。
上面的图是类的初始化,接口的初始化没有静态代码块,而且在初始化时与类初始化有些差异。
类在初始化的时候要求其父类全部已经初始化过了,但是接口只有真正使用父接口的时候才会初始化。 参考《深入理解Java虚拟机》
1.所有的对象实例化都需要调用构造函数 ,个人为是对的,因为你new时候会调用,反射的时候也会调用默认的构造函数,克隆也会,因为构造函数就是为了防止属性不能正确初始化而设计的。
2.
public class A {
static {
Sys ...
使用while的方式进行查找
public static int binarySearch(int[] a, int key) {
int low = 0;
int high = a.length - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (key < a[mid]) high = mid - 1;
else if (key > a[mid]) low = ...
String a ="hello";
String b ="hello";
String c =new String("hello");
System.out.println(a==b);
System.out.println(a==c);
System.out.println(a==c.intern());
运行结果是
true
false
true
因为a和b会直接将hello放到方法区的常量池里面,而c不会, ...
搭建eureka集群
- 博客分类:
- springcloud
搭建三台eureka,修改/etc/hosts
127.0.0.1 server1
127.0.0.1 server2
127.0.0.1 server3
如果显示readonly的话,mac请使用root模式
使用同一个jar包,外置yml优先级高于内置yml优先级
编写yml文件,配置一
server:
port: 1111
eureka:
instance:
hostname: server1
client:
registerWithEureka: false
fetchRegistry: false
ser ...
搭建单节点eureka
- 博客分类:
- springcloud
新建maven项目,然后在pom中加入依赖,参考springcloud网站,地址为https://projects.spring.io/spring-cloud/
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
...
1.mybatis插入时返回自增的主键
<insert id="add" parameterType="EStudent" useGeneratedKeys="true" keyProperty="id">
insert into TStudent(name, age) values(#{name}, #{age})
</insert>
2.mybatis中$和#的区别
#{} 可以 ...