`
AILIKES
  • 浏览: 184086 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA线程安全的问题

阅读更多

线程安全问题是一个比较高深的问题,是很多程序员比较难掌握的一个技术难点,如果一个程序员对线程掌握的很好的话,那么这个程序员的内功修炼的是相当的好。

在这里我主要说一下我对java中如何保证线程安全的一些个人见解,希望对各位有所帮助,那里有不对的地方敬请给位不吝赐教。

线程安全问题主要出现在访问临界资源的时候,就是访问同一个对象的时候,可能会出现无法挽回的损失,特别是在关于资金安全方面的时候,当然还有数据库事务方面的问题。他们很类似,都是要保证数据的原子性。

那么在java中如何保证线程安全呢?

对与共同使用的对象进行加锁,意思是我使用的时候,那么你就必须等待,等我用完之后你再用,反之依然。就像上厕所,你去的时候我是不能去的。

如何加锁呢?下面写三个加锁的方式

首先看一下实例代码

Html代码 复制代码
  1. public class TraditionalSynchornizedTest {   
  2.  /**   
  3.   * @param args   
  4.   */   
  5.  public static void main(String[] args) {   
  6.   new TraditonalSynchornizedTest().sartThread();   
  7.  }   
  8.  public void sartThread(){   
  9.   final Outerput outerput = new Outerput();   
  10.   new Thread(new Runnable(){   
  11.    @Override   
  12.    public void run() {   
  13.     while(true){   
  14.      try {   
  15.       Thread.sleep(5);   
  16.      } catch (InterruptedException e) {   
  17.       e.printStackTrace();   
  18.      }   
  19.      outerput.print("zhangsanfeng");   
  20.     }   
  21.    }   
  22.       
  23.   }).start();   
  24.   new Thread(new Runnable(){   
  25.    @Override   
  26.    public void run() {   
  27.     while(true){   
  28.      try {   
  29.       Thread.sleep(5);   
  30.      } catch (InterruptedException e) {   
  31.       e.printStackTrace();   
  32.      }   
  33.      outerput.print("luxiaofeng");   
  34.     }   
  35.    }   
  36.       
  37.   }).start();   
  38.  }   
  39.  public class Outerput{   
  40.   public void print(String name){   
  41.    for(int i = 0;i < name.length(); i++){   
  42.     System.out.print(name.charAt(i));   
  43.    }   
  44.    System.out.println();   
  45.   }   
  46.  }   
  47. }  

 

以上代码没有对共同持有的对象outerput加锁,所以会出现线程安全问题

1,对代码块加锁

对共同持有的对象加锁可以把内部类写成这样的

Java代码 复制代码
  1. public class Outerput{   
  2.   public void print(String name){   
  3.    synchronized (this) {   
  4.     for(int i = 0;i < name.length(); i++){   
  5.      System.out.print(name.charAt(i));   
  6.     }   
  7.     System.out.println();   
  8.    }   
  9.   }   
  10.  }  

 

2,对非静态方法加锁,加锁的对象是this

Java代码 复制代码
  1. public class Outerput{   
  2.   public synchronized void print(String name){   
  3.    for(int i = 0;i < name.length(); i++){   
  4.     System.out.print(name.charAt(i));   
  5.    }   
  6.    System.out.println();   
  7.   }   
  8.  }   

 

3,对静态方法加锁的对象到底是谁?

Java代码 复制代码
  1. public static synchronized  void print2(String name){   
  2.    for(int i = 0;i < name.length(); i++){   
  3.     System.out.print(name.charAt(i));   
  4.    }   
  5.    System.out.println();   
  6.   }  

 

其实加锁的对象是字节码对象,Outerput.class

如果和非静态方法同时持有同一个对象时,可以持有同一个字节码对象。

 

原文链接:http://flystar007.iteye.com/blog/1404430

分享到:
评论

相关推荐

    Java线程安全问题_动力节点Java学院整理

    其实java的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改。总结java的内存模型,要解决两个主要的问题:可见性和有序性。我们都知道计算机有高速缓存...

    基于java线程安全问题及原理性分析

    "基于java线程安全问题及原理性分析" 基于 Java 线程安全问题是指在多线程环境中,多个线程访问同一个对象时可能发生的安全问题。这种问题产生的根本原因是共享数据存在被并发修改的可能,即一个线程读取时,允许另...

    如何实现Java线程安全问题

    Java线程安全问题解决方案 Java线程安全问题是指在多线程编程中,多个线程访问共享资源时可能出现的数据不一致、数据丢失或程序崩溃等问题。为了解决这些问题,Java提供了多种解决方案,包括使用同步代码块、同步...

    java线程安全测试

    Java线程安全是多线程编程中的一个关键概念,它涉及到多个线程访问共享资源时可能出现的问题。在Java中,线程安全问题通常与并发、内存模型和可见性有关。Java内存模型(JMM)定义了如何在多线程环境下共享数据的...

    Java线程安全问题小结_动力节点Java学院整理

    Java线程安全问题主要涉及到并发环境下多个线程对共享资源的访问和修改,这可能导致数据不一致、死锁等问题。Java内存模型(JMM)是Java语言为了保证跨平台的并发正确性而设定的一套规范,它规定了线程如何访问和...

    java线程安全总结.doc

    Java线程安全是多线程编程中的一个关键概念,它涉及到在并发环境下如何正确地管理共享资源,确保程序的正确性和一致性。以下是对Java线程安全的深入总结: ### 一、线程安全的定义 线程安全是指当多个线程访问同一...

    Java多线程 - (一) 最简单的线程安全问题

    总之,理解并掌握Java中的线程安全问题及其解决方案是每个Java开发者必备的技能,这不仅可以确保程序的正确性,还能有效利用多核处理器,提升系统性能。在阅读源码时,也要注意观察作者如何处理线程安全,这对于提升...

    关于如何解决HashMap线程安全问题的介绍

    总结起来,理解HashMap的线程不安全性及其潜在问题,并根据实际需求选择合适的安全措施,是确保Java程序稳定运行的关键。无论是使用Collections.synchronizedMap()、ConcurrentHashMap还是避免在多线程环境中使用,...

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    它展示了如何与非线程安全的类共同工作,并特别关注于Swing的线程问题。新增加的一章介绍了如何为多处理器机器编写并行代码。 简而言之,本书的新版涉及了有关线程的方方面面,从最简单的动画applet到最复杂的应用...

    Java多线程安全集合

    在Java编程中,多线程安全集合是程序员在并发环境下处理数据共享时必须考虑的关键概念。这些集合确保了在多个线程访问时的数据一致性、完整性和安全性,避免了竞态条件、死锁和其他并发问题。Java提供了一系列的线程...

    java线程线程安全同步线程

    总的来说,理解和掌握Java线程的创建、状态管理、同步机制和线程安全是进行多线程编程的基础,这对于开发高效、稳定的并发程序至关重要。在实际编程中,应充分利用Java提供的工具和机制,避免潜在的并发问题,提升...

    Java多线程-线程的安全问题与线程的同步机制介绍

    Java多线程-线程的安全问题与线程的同步机制介绍 在 Java 多线程编程中,线程安全问题是非常重要的一个话题。当多个线程访问同一个资源时,如果只有读操作那么不会出现线程安全问题,但是如果多个线程对资源进行读...

    Java线程讲解Java线程讲解

    4. **生产者消费者模式**:这是一个经典的多线程问题,通过生产者(Producer)和消费者(Consumer)模型来解决资源的生产和消费问题。 - **生产者**:负责生产数据并将其放入缓冲区。 - **消费者**:负责从缓冲区...

    Java线程安全.docx

    Java线程安全是指在多线程并发编程中,如何确保线程安全地访问和修改共享资源的问题。Java内存模型(JMM)是Java虚拟机(JVM)定义的内存模型,旨在屏蔽底层平台的内存管理细节,提供了一个统一的内存模型规范。 ...

    java线程安全以及生产者消费者demo

    Java线程安全与生产者消费者模型是多线程编程中的两个重要概念,它们在并发处理中扮演着关键角色。在Java中,线程安全是指一个类或者方法在多线程环境下能够正确地处理数据,避免数据的不一致性或竞态条件。而生产者...

    Java多线程-线程安全问题练习题

    在Java多线程编程中,线程安全问题是非常关键的概念,它涉及到多个线程访问共享资源时可能出现的数据不一致或异常情况。本题主要通过两个练习题来加深对线程安全的理解。 ### 练习题1:新年倒计时 #### 题目描述 ...

    java线程分析工具TDA

    Java线程分析是Java开发中的重要环节,尤其是在处理性能优化、死锁排查或者并发问题时。TDA(Thread Dump Analyzer)是一款强大的Java线程分析工具,它能够帮助开发者深入理解应用在运行时的线程状态,包括线程的...

    JAVA线程dump的分析

    JAVA线程dump是指在JAVA程序中,当前线程的状态和调用堆栈的快照,能够帮助开发者了解当前程序的执行情况,诊断问题和性能瓶颈。生成JAVA线程dump的方法在不同的操作系统下是不同的,在Windows环境中,可以敲击Ctrl-...

    java线程深入解析

    本文将深入解析Java线程的相关知识点,包括线程的定义、创建、状态管理、线程同步和安全问题。 1. **线程定义** 在Java中,线程是进程中的单一顺序控制流,是程序执行的基本单元。线程在进程的上下文中运行,共享...

Global site tag (gtag.js) - Google Analytics