Java并发编程:线程安全
当多个线程需要同时访问同一个资源(成为临界资源)时,可能会对数据造成破坏。
例如:money += 1000; 当第一个线程取出money值,然后+1000完成这两步之后,第二个进程进入读取了count的值,又+1000 再赋值给count。 这时 第一个线程再进行第三步,把它的值赋给count,这就出现了混乱,没有达到预期的效果(两个线程只存进去了1000)。
所以,需要同步互斥访问来解决线程安全问题。 Java提供了 synchronized 和 Lock 方式进行同步互斥访问。
1.synchronized 关键字
->实例方法同步,对对象加锁
public synchronized void add(int i){ i += 1; }
一个线程只能访问一个实例变量的add()方法
->静态方法同步
public static synchronized void add(int i){ i += 1; }
同步在该方法所在的类对象(JVM中一个类只有一个类对象.class)上,所以同时只允许一个线程执行同一个类中的静态同步方法。
->实例方法中的同步块
public void add(int i){ synchronized(this){ //this指代调用add()方法的实例对象(即监视器对象),一次只有一个线程可以执行该同步代码块 i += 1; //当在某个线程中执行这段代码块,该线程获取这个对象的锁,从而使得其他线程无法同时访问该代码块。 } }
->静态方法中的同步块
public static synchronized void add(int i){ //只能被类对象的一个线程访问 synchronized(this){ i += 1; } }
对于synchronized方法或者synchronized代码块,当出现异常时,JVM会自动释放当前线程占用的锁,因此不会由于异常导致出现死锁现象。
下面有两个栗子:
1).多个线程访问共享数据:设计4个线程,其中两个对j增加1,另外两个对j减少1
public class MultiThreadShareData { private int j; public static void main(String[] args) { MultiThreadShareData mts = new MultiThreadShareData(); Inc inc = mts.new Inc(); Dec dec = mts.new Dec(); for(int i=0; i<2; i++){ Thread t1 = new Thread(inc); t1.start(); t1 = new Thread(dec); t1.start(); } } private synchronized void inc(){ j++; System.out.println(Thread.currentThread().getName() + "-inc:" + j); } private synchronized void dec(){ j--; System.out.println(Thread.currentThread().getName() + "-dec:" + j); } class Inc implements Runnable{ public void run() { for(int i=0; i<100; i++){ inc(); } } } class Dec implements Runnable { public void run() { for(int i=0; i<100; i++) { dec(); } } } }
2).设计程序:子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次。
public class ThreadCommunication { public static void main(String[] args) { final Business bussiness = new Business(); new Thread(new Runnable(){ public void run() { for(int i=1; i<=50; i++){ bussiness.sub(i); } } }).start(); for(int i=1; i<=50; i++){ bussiness.main(i); } } } class Business{ private boolean bShouldSub = true; public synchronized void sub(int i) { while(!bShouldSub){ try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int j=1; j<=10; j++) { System.out.println("sub thread sequence of " + j + ", loop of " + i ); } bShouldSub = false; this.notify(); } public synchronized void main(int i) { while(bShouldSub){ try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int j=1; j<=100; j++) { System.out.println("main thread sequence of " + j + ", loop of " + i ); } bShouldSub = true; this.notify(); } }
相关推荐
本资源致力于向您介绍 Java 并发编程中的线程基础,涵盖了多线程编程的核心概念、线程的创建和管理,以及线程间通信的基本方法。通过深入学习,您将建立扎实的多线程编程基础,能够更好地理解和应用多线程编程。 多...
通过深入了解 Java 并发编程和 JUC 线程池,您可以更好地管理线程之间的协作和同步,充分发挥多核处理器的优势,确保程序稳定运行。 了解 Java 并发编程和 JUC 线程池是现代软件开发者的必备知识。通过掌握并发编程...
Java 并发编程中的 JUC(java.util.concurrent)库以及其核心组件 AQS(AbstractQueuedSynchronizer)在构建高性能、可伸缩性的多线程应用方面具有重要的地位。 AQS 是 JUC 中的核心组件,它提供了一个框架,让...
java并发编程pdf文档第二部分:Java并发编程实战.pdf、Java多线程编程核心技术.pdf、实战Java高并发程序设计.pdf
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...
《Java并发编程:设计原则与模式(第二版).pdf》,自己看看
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) ...
自从java创建以来就已经支持并发的理念,如线程和锁。这篇指南主要是为帮助java多线程开发人员理解并发的核心概念以及如何应用这些理念。...开发者通过这些基础的接口可以构建高并发、线程安全的java应用程序。
深入讲解java并发编程技术,多线程、锁以及java内存模型等
第2章 线程安全性 2.1 什么是线程安全性 2.2 原子性 2.2.1 竞态条件 2.2.2 示例:延迟初始化中的竞态条件 2.2.3 复合操作 2.3 加锁机制 2.3.1 内置锁 2.3.2 重入 2.4 用锁来保护状态 2.5 活跃性与性能 第...
《Java并发编程实战》深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证...
博文链接:https://projector.iteye.com/blog/209636
《Java并发编程从入门到精通》内容包括并发编程概念,线程,线程安全,线程集合类,线程阀,线程池,Fork/Join,线程、线程池在互联网项目开发的应用,线程监控及线程分析,Android中线程应用。 本书适合Java开发...
java 并发 编程 多线程 concurrent lock condition executorserice executor java.util.curcurrent.
《java并发编程的核心方法和框架.pdf》,好好学习,天天向上。。。
网络编程,分布式,并发,多线程,多进程学习必备
《Java并发编程实战》是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程...
《java并发编程实战》是java并发的圣经。亲自整理目录结构,层级分明(福昕阅读器整理)。高清。