java Thread学习(共享资源)
2016-10-12 16:25
162 查看
Thread2共享资源
java中的同步机制有两种:同步块(方法)和volatile变量。锁:所提供了两种特性:互斥和可见性。
互斥(原子性):只允许一个线程持有某种锁。所以可以对共享的数据协调访问。Java内存模型中原子性变量操作是read、load、assign、use、store、write,大致可以认为基本数据类型(long/double除外)访问读写是具有原子性的。
可见性:保证在锁的期间对数据做出的修改,当释放锁之后该修改对于之后获得锁的线程是可见的。保证了线程获取到的值是最新被修改的。
java内存模型:在内存模型中线程存在于自身的线程栈中。在对数据的操作中,也是操作的数据的副本。通过read、load从主内存中读取数据,然后在线程栈中创建对应的副本,对副本进行assign、use操作,然后将结果写入线程栈中,最终write讲数据发回主内存。
Volatile变量
Volatile的特性:具有可见性,但是不具有原子性。也就是说线程能自动发现最新值。所以所每次使用变量的时候都会读取最新值。相当于是对变量的读和写操作加了一个锁。
Volatile对内存的可见性影响:volatile变量写-读可以用来实现内存之间的通信。例如可以使用volatile的flag,在写入后设为true,读取的时候判断是否为true。保证了写一定发生在读之前
synchronized变量
可以用来修饰代码块、方法、静态方法、类
修饰代码块时指定对象。
对象含有单一的锁,也就是说调用了一个synchronized方法后,该对象就会加上一个锁,访问对象中其他任意一个synchronized方法都会被挂起。
并发时,将域设为private非常重要,只有私有的才能被加锁
一个类也有一个锁,所以synchronized可以加到static方法上,用来个static数据加锁。
修饰一个类是,作用于所有的对象。也就是说所有对象都是一把锁
Lock
Lock对象需要手动创建、锁定、释放
java Lock lock = new ReentrantLock(); lock.lock(); lock.unlock();
原子类
java SE5中引入了原子类,例如AtomicInteger、AtomicLong、AtomicReference等原子变量类,保证对变量操作的原子性
线程本地存储
ThreadLocal:线程局部变量。在每个线程中都创建副本。 如果一个属性不是线程安全的,但是又不需要在各个线程中共享这个属性可以使用ThreadLocal。所以通常是private static的,因为希望它与线程相关,而不是和对象相关
- set(T) 设置线程副本中的值
- get() 获取线程副本中的值
- initialValue:返回线程副本中的初始值。经常被用来设置初始值
- remove() 移除此线程中的局部变量的值
相关文章推荐
- JAVA学习笔记 -- 多线程之共享资源
- JAVA编程思想学习总结:第21章第3节共享受限资源
- Java通过继承Thread类实现多线程 ,处理同一个共享资源
- Java 多线程之 Runnable VS Thread 及其资源共享问题
- JAVA学习37_同一进程中的线程究竟共享哪些资源
- Java学习笔记之实现Runnable接口可以资源共享(卖票系统)
- Java并发编程(Java Concurrency)(9)- 线程安全与共享资源(Thread Safety and Shared Resources)
- Java学习笔记 --- 多线程共享资源Demo
- JAVA学习笔记 -- 多线程之共享资源
- Thread学习之资源共享
- [JAVA学习笔记-82]Thread states in JAVA
- 9、Java并发性和多线程-线程安全与共享资源
- java学习资源
- java线程共享受限资源 解决资源竞争 thinking in java4 21.3
- Java学习资源
- Java-2-学习历程2:基础知识1,2,3文档、完整版视频资源、电子书籍下载
- JAVA的学习资源
- C# 多线程学习(六)线程池(ThreadPool)——线程资源的复用和自动管理
- java学习_小程序(四线程断点网络资源下载,即时进度反馈)
- Java学习资源转载