Unsafe有点类似于反射, 但Unsafe速度快于反射,通过Unsafe可以拿到某个成员变量相对于类的偏移量,然后再按照偏移量拿到某个对象的这个成员变量的值 。很多锁的同步底层都是用Unsafe做的。如Unsafe的CAS
http://frankfan915.iteye.com/admin/blogs/1153726
ReentrantLock
ReentrantLock的特点是
1.它可以被重入,获得锁的线程可以反复获得锁,锁的次数会增加,释放的时候也需要释放相应的次数才能完全释放当前锁(Syncronized也是可以重入的)
2. Lock和unlock可以不在同一个代码块中,unlock一般在final块中
3. ReentrantLock是用CAS机制保证同步的,速度快于Syncronized
4. ReentrantLock分为公平锁和非公平锁,公平锁是先申请锁,先获得锁
5. ReentrantLock可以调用acquireInterruptibly方法获取锁,当线程中断的时候,抛出一个异常,可以防止死锁
6. ReentrantLock支持多个condition,可以很好的解决put和get多条件等待的问题
http://frankfan915.iteye.com/admin/blogs/1182026
http://frankfan915.iteye.com/admin/blogs/2099821
synchronized的底层实现主要依靠Lock-Free的队列,基本思路是自旋后阻塞,竞争切换后继续竞争锁,稍微牺牲了公平性,但获得了高吞吐量。
http://blog.csdn.net/chen77716/article/details/6618779
Volatile
Volatile的优点是
1.代码比较简单,只要在变量前加Volatile
2.可扩展性好
3.性能好,不需要锁住代码块
4.Volatile保证了变量的可见性,但不能保证变量的原子性(如i++不是线程安全的)
缺点:
容易出错,比较难设计
原理是加了Volatile的变量的更新都是直接更新到主内存的。多个线程共享一个主内存,但是每个线程都有自己的工作线程。对于没有Volatile的变量,线程都是拷贝主线程到工作内存,然后进行操作,被修改的值可能会在工作内存保存一段时间,不能及时的更新到主内存。Volatile一般都是和CAS一起使用,保证对数据操作的原子性。详见ReentrantLock
http://frankfan915.iteye.com/admin/blogs/1222627
Interrupt和stop的区别:
如果该线程处在可中断状态下,(调用了xx.wait(),或者Selector.select(),Thread.sleep()等特定会发生阻塞的 api),那么该线程会立即被唤醒,同时会受到一个InterruptedException,同时,如果是阻塞在io上,对应的资源会被关闭。如果该线 程接下来不执行“Thread.interrupted()方法(不是interrupt),那么该线程处理任何io资源的时候,都会导致这些资源关闭。interrupt不会导致线程直接退出,还是会在继续执行run函数。
Stop会让线程直接退出。
线程封闭,是指变量只能被一个线程使用从而达到线程安全。三种情况:1.每个对象只被一个线程用时就是Confinement的 2.方法内的成员变量 3.ThreadLocal获得的变量
http://frankfan915.iteye.com/admin/blogs/1223081
Sleep和wait的区别:
sleep来自 thread类,wait来自 object类
sleep不释放锁,还有线程控制权。wait释放锁,交出线程控制权,需要notify
sleep必须捕捉异常,wait不必
Thread Join方法是需要先获得线程对象的锁,然后调用wait方法
http://frankfan915.iteye.com/admin/blogs/1222319
lock和condition的使用
http://frankfan915.iteye.com/admin/blogs/2099821
LinkedBlockingQueue
http://frankfan915.iteye.com/admin/blogs/2099831
ConcurrentLinkedQueue
http://frankfan915.iteye.com/admin/blogs/2099850
ConcurrentHashMap使用了多个Segment来存储数据,每个Segment相当于一个hashTable,不同Segment之间的读写删操作都是无关的。同一个Segment的写和删是需要加锁的,读是不用加锁的。增加的锁都是放在队列的头,删是通过拷贝被删节点前的所有节点来实现的
http://www.iteye.com/topic/344876
CountDownLatch 它的Sync函数和ReentrantLock不同,如果state值为0的时候,返回1,表示当前线程可以重新被调度。其他函数调用tryReleaseShared降低state,当state==0时unpark等待的线程。
private static final class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 4982264981922014374L; protected int tryAcquireShared(int acquires) { return (getState() == 0) ? 1 : -1; } protected boolean tryReleaseShared(int releases) { // Decrement count; signal when transition to zero for (;;) { int c = getState(); if (c == 0) return false; int nextc = c-1; if (compareAndSetState(c, nextc)) return nextc == 0; } } }
相关推荐
在准备大数据面试的过程中,Java基础是必不可少的一部分,尤其聚焦于集合类、多线程和JVM这三大核心领域。下面将分别对这三个方面进行深入探讨。 **一、Java集合类** Java集合框架是处理对象组的重要工具,它包括...
这份"java-java面试题库整理-基础-JVM-线程并发-框架等.zip"文件提供了一个全面的复习资源,帮助求职者准备Java相关的面试。 1. **Java基础知识** - 类与对象:Java是一种面向对象的语言,了解类的定义、构造器、...
理解线程的生命周期、同步机制(synchronized关键字、wait()、notify()等)是并发编程的关键。 6. **网络编程**:Socket编程是Java进行网络通信的主要方式,通过ServerSocket和Socket类,可以创建客户端和服务器端...
通过学习和复习这些知识点,并结合"Java-Interview-超全集合github上评分最高的jiva面试题"中的题目进行实战演练,可以有效地提升Java开发者在面试中的竞争力,为成功获得理想职位打下坚实基础。在面试准备过程中,...
- 线程同步:synchronized关键字,wait(), notify(), notifyAll()方法,以及Lock接口的使用。 - 守护线程与线程池:理解守护线程的概念,以及ExecutorService线程池的创建与管理。 8. **反射机制** - 类的加载:...
4. **多线程与并发**:Java提供了丰富的并发工具,如synchronized关键字、volatile变量、ThreadLocal、并发集合(如ConcurrentHashMap)等,掌握这些能解决多线程环境下的同步问题。 5. **内存管理与垃圾回收**:...
8. **线程同步**:Java提供了多种线程同步机制,如`synchronized`关键字、`wait()`, `notify()`, `notifyAll()`,以及`Lock`接口等,用于控制多线程对共享资源的访问,防止数据不一致。 9. **final关键字**:`final...
- `synchronized`关键字用于实现线程同步,防止数据竞争。它可以修饰方法或代码块,确保同一时刻只有一个线程能执行同步代码。 - 死锁是当两个或更多线程互相等待对方释放资源而陷入的一种僵局。避免死锁的关键是...
通过复习这些内容,你可以巩固对Java语言的理解,提高编程能力,并为更高级的主题(如设计模式、并发编程、网络编程等)打下坚实的基础。在实践中不断应用这些知识点,将有助于你在Java开发领域取得更大的进步。
- 线程同步:synchronized关键字,wait()和notify()方法,以及Lock接口。 11. **IO流** - 流的概念:输入流、输出流,字节流与字符流。 - 文件操作:读写文件,以及使用BufferedReader和BufferedWriter优化性能...
3. `join()`: 让当前线程等待该线程结束后再继续执行,常用于线程同步。 4. `sleep(long millis)`: 使当前线程暂停指定毫秒数,然后继续执行。可以避免线程过度抢占CPU资源。 5. `yield()`: 让当前线程暂停,让相同...
10. 类和方法的修饰符:除了访问控制符外,还有其他修饰符如`final`(不可变)、`abstract`(抽象)、`synchronized`(同步)和`volatile`(可变,线程安全)等,它们用于定义类和方法的特性。 以上是Java编程中...
- **线程同步**:线程同步是控制多线程访问共享资源的一种方式,常见的同步机制有`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法。 - **线程创建**:有两种创建线程的方法,一是通过继承Thread类...
这份"Java复习资料"包含了从第一章到第十章的详细学习内容,覆盖了Java语言的基础到高级特性,对于准备Java考试或者提升编程技能的学员来说非常有价值。 1. **第一章:Java简介** - Java的历史和发展 - Java的...
### Java秋招复习资料——操作系统基础 #### 一、操作系统基本特征 1. **并发**:并发是指在宏观上能够同时运行多个程序...以上内容为Java秋招复习资料中关于操作系统的基础知识总结,希望对准备面试的同学有所帮助。
### JAVA-复习终结java复习资料 #### 一、数组长度属性 在Java中,所有数组都具有一种内置的属性——`length`,该属性用来表示数组中元素的数量。例如,对于一个整型数组`int[] arr = new int[5];`,`arr.length`将...
- `wait()`, `notify()`, `notifyAll()`: 支持多线程同步控制。 - `clone()`: 实现对象的浅拷贝。 - `getClass()`: 获取对象所属的类。 #### 二十二、Java中的“指针” 虽然Java没有传统意义上的指针,但在底层...
5. **多线程**:Java提供了强大的多线程支持,包括Thread类和Runnable接口,以及同步机制(如synchronized关键字、volatile变量、Lock接口)。理解并发编程的概念和策略,如死锁、活锁、饥饿,对于编写高性能的多...
Java编程语言是软件开发领域广泛使用的编程语言,尤其在企业级应用中占据着主导地位。作为Java程序员,掌握基础..."JAVA程序员必读--基础篇"的CHM文件应该包含了这些内容的详细讲解,是学习和复习Java基础的宝贵资源。
- 熟悉线程同步机制,包括synchronized关键字、wait()、notify()和notifyAll()方法。 - 掌握死锁、活锁、饥饿的概念及其避免方法。 8. **IO流** - 文件操作,包括读写文件、复制文件。 - 字节流和字符流的区别...