对象的状态 : 指存储在状态变量中的数据
同步机制:
synchronized,它提供了一种独占锁,但同步这个术语还包括volatile类型的变量,显式锁以及原子变量。
注意 : 如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出错,可以通过下面的三种方法来解决。
不在线程之间共享该状态变量、将状态变量修改为不可变的变量、在访问状态变量时使用同步。
一、线程安全性:当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类时线程安全的。线程安全类中封装了必要的同步机制,不须客户端采取同步措施
无状态的对象一定是线程安全的
二、原子性:为了避免竞态条件,就必须在某个线程修改该变量时,通过某种方式防止其他线程使用整个变量
1:竞态条件 :由于不恰当的执行时序而出现不正确的结果,例如延迟初始化就会产生这样的情况。
2:要保持状态的一致性,就需要在单个原子操作中更新所有相关的状态变量
三、加锁机制
1:java内置锁(互斥锁) : java提供了一种内置的锁机制来支持原子性(同步代码块)
同步代码块包括两部分,一个作为锁的对象引用、一个作为由这个锁保护的代码块
以关键字synchronize来修饰的方法是一种横跨整个方法体的同步代码块,其中该同步代码块的锁就是方法调用所在的对象
静态的synchronized方法以Class对象作为锁
2:重入 : 同一个线程可以多次获得同一个锁。
当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会阻塞。重入的一种实现方法是,为每个锁关联一个获取计数值和一个所有者线程。
当计数值为0时,这个锁就被认为是没有被任何线程持有。当线程请求一个未被持有的锁时,jvm将记下锁的持有者,并且将获取计数值置为1。如果同一个线程再次获取这个锁,计数值将递增,而当线程退出同步代码块时,计数器会相应地会相应地递减。当计数值为0时,这个锁将被释放。
如果没有使用重入:会发生死锁
public class A {
public synchronized void doSomething(){
}
}
public class B extends A {
public synchronized void doSomething(){
super.doSomething();
}
}
四、用锁来保护状态
如果用同步来协调某个变量的访问,那么在访问这个变量的所有位置上有需要使用同步
使用锁来对某个变量的访问时,在访问变量的所有位置上都要使用同一个锁
对于可能被多个线程同时访问的可变状态变量,在访问它时都需要持有同一个锁
五、可见性 :没有使用足够的同步机制,无法保证一个线程写入的值,对于另一个线程读的值是可见的
volalite 变量 : 不会加锁,不会使线程阻塞,通过将变量的更新通知到其它线程,来实现同步。当只有确保单线程修改这个变量时,才可使用
六、线程封闭
1、java语言提供了一些机制来维持线程封闭:局部变量(栈封闭)和ThreadLocal类
七、不变性
1、不可变对象一定是线程安全的,不需要同步
2、final 修改的变量时引用不可修改,对象还是可以修改的
3、事实不可变 : 同不可变对象一样
public map<String,Date> lastLogin = Collections.synchronizeMap(new HashMap<String,Date>);
八、安全发布
1: 在静态初始化函数中初始化一个对象引用
2: 将对象的引用保存到volatile类型的域或者atomic对象中
3: 将对象的引用保存到某个正确构造对象的final类型域中
4: 将对象的引用保存到有锁保存的域 (线程安全容器就是通过这个的方式实现的)
5: 线程安全库的容器类:下面都可以安全地将它发布给任何从这些容器中访问它的线程
将键或值,放到hashtable、synchronizedmap、concurrentmap中
将元素放到vector、copyonwriteArrayList、CopyOnwriteArraySet、synchronizedlist、synchronizedset
将元素放到 blockingQueue、concurrentlinkedQueue
相关推荐
本文将深入探讨Java并发基础知识,包括并发的目的、并发编程的缺点、减少上下文切换的策略、并行与并发的区别、同步与异步的概念,以及线程的管理方式。 一、并发的目的 并发的主要目的是充分利用多核CPU的计算能力...
书中会首先介绍Java并发编程的基础知识,包括线程的创建和运行,同步机制的基本用法,以及Java内存模型的相关概念。随着章节的深入,作者可能会更深入地讲解Java提供的并发工具,例如锁、原子变量、线程池、以及并发...
### Java并发基础知识 在Java开发过程中,理解和掌握并发编程对于构建高效、稳定的应用程序至关重要。本教程将基于“Java并发视频教程”这一资源,详细解析Java并发编程的基础概念与核心API,帮助读者全面理解Java...
#### 二、并发基础知识 本书不仅适合已经有一定Java编程经验的开发人员阅读,也适用于希望深入了解并发编程基础的新手。它从最基本的并发概念讲起,如进程与线程的区别、线程生命周期、线程调度策略等,并逐步深入到...
### Java并发基础知识 #### 并发与并行的概念 在深入探讨Java并发之前,我们首先需要理解并发(Concurrency)与并行(Parallelism)的区别。并发是指在同一时间段内处理多个任务的能力,而并行则是在同一时刻执行多...
总之,《Java并发编程实战》是一本全面介绍Java并发编程的书籍,适合有一定Java基础并希望提升并发编程能力的开发者阅读。通过学习,你可以掌握解决并发问题的策略和技巧,编写出更加健壮和高效的多线程应用。
此外,Java并发编程还包括对并发容器的使用,如ArrayList、LinkedList、HashSet、HashMap等基础容器在并发环境下可能存在问题,Java提供了一些线程安全的容器,如Vector、HashTable以及java.util.concurrent包下的...
通过阅读《Java并发编程的艺术》这本书,开发者不仅可以掌握Java并发编程的基础知识,还能了解到一些高级特性和技巧,从而在实际开发中游刃有余。同时,附带的源码将有助于加深理解,提供实际操作的机会。
下面将详细讨论Java并发编程中的主要知识点。 1. **线程基础**:首先,了解线程的概念和创建方式至关重要。Java提供了多种创建线程的方法,如继承`Thread`类或实现`Runnable`接口。理解线程的状态转换(新建、就绪...
《JAVA并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。它涵盖了Java并发的核心概念、工具和最佳实践,旨在帮助读者在多线程环境下编写高效、安全的代码。 并发编程是现代软件开发中的关键技能,...
"Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效地实现并发。 并发是指在单个执行单元(如CPU)中同时执行两个或更多任务的能力。在Java中,这主要通过线程来实现,...
这些基础知识是理解并发编程的基石,通过深入浅出的讲解,使读者能够轻松上手。 接着,书中将深入探讨Java并发工具类,如Executor框架、Semaphore信号量、CyclicBarrier和CountDownLatch等,这些工具在实际项目中...
### Java并发编程实践 #### 一、并发编程基础 ##### 1.1 并发与并行的区别 ...通过上述知识点的学习,我们可以更好地理解和掌握Java并发编程的基本原理和技巧,为开发高效稳定的并发应用程序打下坚实的基础。
首先,书中会讲解Java并发的基础知识,包括线程的创建、启动、同步与通信。Java通过Thread类和Runnable接口提供线程支持,读者将学习如何创建和管理线程。同步机制如synchronized关键字、volatile变量以及java.util....
Java是一种广泛使用的面向...通过深入学习以上知识点,并结合实际项目练习,你将能够提升Java编程技能,为职业发展打下坚实基础。这份"JAVA核心知识点整理.zip"资料将是你宝贵的参考资料,助你在Java的世界中游刃有余。
java基础知识学习资料 java开发实践案例 项目学习 源代码 供参考java基础知识学习资料 java开发实践案例 项目学习 源代码 供参考java基础知识学习资料 java开发实践案例 项目学习 源代码 供参考java基础知识学习资料...