线程安全
- 每个线程执行的时候会把局部变量存放在各自栈帧的工作内存中(栈帧进入虚拟机栈),虚拟机栈线程间不共享,故不存在线程安全问题。
- 方法区不存在线程不安全问题,每個线程都会把代码块复制一份,代码块对于程序来说就相当于指令
synchronized修饰方法
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种: 2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象; 3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
修饰代码块,synchronized(类或者对象){代码块}**
- 如果是类,那么监听的就是这个类的所有对象。那么多个线程对所有这些对象的synchronized代码块访问都是同步的。
- 如果是对象,那么监听的是某一个对象,那么多个线程对这一个对象的synchronized代码块访问是同步的。
- 一个线程访问一个对象的synchronized代码块时,别的线程可以访问该对象的非synchronized代码块而不受阻塞。

重点 (看到这里,上面几点就可以忽略,这里是根本性的总结)
synchronized(this) 跟synchronized(object)区别:
其实用this跟object以及class都无所谓,只是作为锁的一个监听标示。只要监听标示是同一个对象就行,这样多线程就进行同步操作了。否则不是同一个,运行就是异步执行了。
换句话说 synchronized()是锁住了括号内的东西,当多个线程访问synchronized控制的代码时,如果括号内的标示都是同一个,那么需要等另一个线程访问完释放。
Object wait notify
主要用于synchronized(object)方式
wait设置线程1阻塞等待。在另一个线程2中使用notify方法唤醒处于等待的线程1继续往下执行。
Lock
Lock在锁的使用上比synchronized更控制精细。lock是jdk api提供的方式而synchronized是jvm原生的语义
synchronized缺点比如:如果线程得不到锁会一直处于阻塞等待状态。
lock提供主要4个方法:
- lock();//获取锁,阻塞方法
- lockInterruptibly();获取锁,阻塞方法。在线程获锁过程中,可以通过thread.interrupt()中断本线程。
- tryLock()//获取锁,不会阻塞。立马返回结果 true或false
- tryLock(time,timeunit)//获取锁,设置阻塞的时长。在线程获锁过程中,可以通过thread.interrupt()中断本线程。
- unlock()释放锁
condition
lock中condition提供signal await方法用来实现跟Object的await notify同样的功能。
对应实例代码 gitee.com/jessecx/doc…
参考 blog.csdn.net/justloveyou…
spring bean作用域 singleton prototype request
kafka通过zk来存储集群信息,topic等信息。通过zk来帮忙寻找集群中各个节点。