1: voliate
用在多线程,同步变量。 线程为了提高效率,将成员变量(如A)某拷贝了一份(如B),线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。volatile就是用来避免这种情况的。volatile告诉jvm, 它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A) ,但是不能用其来进行多线程同步控制
- public class Counter {
- public volatile static int count = 0;
- public static void inc() {
- //这里延迟5毫秒,使得结果明显
- try {
- Thread.sleep(5);
- } catch (InterruptedException e) {
- }
- //synchronized(Counter.class) {
- count ++;
- //}
- }
- public static void main(String[] args) throws InterruptedException {
- final CountDownLatch latch = new CountDownLatch(1000);
- //同时启动1000个线程,去进行i++计算,看看实际结果
- for (int i = 0; i < 1000; i++) {
- new Thread(new Runnable() {
- @Override
- public void run() {
- Counter.inc();
- latch.countDown();
- }
- }).start();
- }
- latch.await();
- //这里每次运行的值都有可能不同,可能为1000
- System.out.println("运行结果:Counter.count=" + Counter.count);
- }
- }
可以看到,运行结果:Counter.count=929(数字随机),但如果将注释掉的同步块synchronized打开,console输出则为1000
2.synchronized
它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
五、以上规则对其它对象锁同样适用.
3:AtomicInteger
使用AtomicInteger,即使不用同步块synchronized,最后的结果也是1000,可用看出AtomicInteger的作用,用原子方式更新的int值。主要用于在高并发环境下的高效程序处理。使用非阻塞算法来实现并发控制。
- public class Counter {
- public static AtomicInteger count = new AtomicInteger(0);
- public static void inc() {
- //这里延迟1毫秒,使得结果明显
- try {
- Thread.sleep(1);
- } catch (InterruptedException e) {
- }
- count.getAndIncrement();
- }
- public static void main(String[] args) throws InterruptedException {
- final CountDownLatch latch = new CountDownLatch(1000);
- //同时启动1000个线程,去进行i++计算,看看实际结果
- for (int i = 0; i < 1000; i++) {
- new Thread(new Runnable() {
- @Override
- public void run() {
- Counter.inc();
- latch.countDown();
- }
- }).start();
- }
- latch.await();
- //这里每次运行的值都有可能不同,可能为1000
- System.out.println("运行结果:Counter.count=" + Counter.count);
- }
- }
http://blog.csdn.net/shihuacai/article/details/8856262
相关推荐
### Java多线程知识点详解 #### 一、Java Thread 概念 在Java中,**线程**是一种轻量级的进程,它是程序执行流的最小单元。一个标准的Java应用通常至少包含一个线程,即主(Main)线程。Java支持多线程编程,这...
Java多线程编程是提升程序性能和响应性的关键技术。理解多线程的概念,掌握线程的创建、同步、通信、死锁避免等核心知识点,以及合理使用线程池,对于编写高效、稳定的并发程序至关重要。通过实践,开发者可以更好地...
Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个不同的任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程技术被广泛应用,尤其是在服务器端应用、并发处理以及高并发场景下,Java多...
要认识多线程就要从操作系统的原理说起。以前古老的DOS操作系统(V6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情。比如你在copy东西的时候不能rename文件名。为了提高系统的利用效率,采用批处理来...
Java多线程结构是Java编程中的重要组成部分,它允许程序同时执行多个任务,提升系统效率。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当自定义类继承Thread类时,...
Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:通过实现`Runnable`接口和继承`Thread`类。 1. 实现Runnable接口 当一个类...
Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...
【Java多线程读取大文件】是一种优化的文件处理策略,特别适用于处理大型文本文件。在传统的单线程I/O操作中,读取大文件可能导致内存溢出(OOM),尤其是在尝试一次性加载整个文件到内存时。为了避免这个问题,我们...
Java多线程下载器是一种利用Java编程语言实现的高效文件下载工具,它通过将大文件分割成多个部分并同时下载,显著提高了下载速度。在Java中实现多线程下载器涉及许多关键概念和技术,包括线程、并发控制、网络I/O...
Java多线程是Java编程中的核心概念,尤其对于高级开发者来说,掌握多线程的深入理解和应用至关重要。这本书“java多线程进阶”显然旨在帮助读者深化这方面的理解,打通编程中的“任督二脉”,使开发者能够更加熟练地...
"Java多线程并发执行demo代码实例" 在Java编程中,多线程并发执行是非常重要的概念,它可以提高程序的执行效率和响应速度。今天,我们通过一个demo代码实例来学习Java多线程并发执行的实现。 知识点1:泛型 在...
Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类和并发工具来实现,接下来我们将深入探讨这些关键知识点。 1. **...
《Java多线程编程核心技术》建议猿友们读两遍,因为其写得没有那么抽象,第一遍有些概念不是很理解,可以先跳过并记录起来,第一遍阅读的目的主要是了解整个架构。第二遍再慢慢品味,并贯穿全部是指点来思考,并将...
JAVA多线程编程实例详解 JAVA多线程编程是指在一个程序中可以同时运行多个线程,以提高程序的执行效率和响应速度。JAVA多线程编程可以通过继承Thread类或实现Runnable接口来实现。 在JAVA中,线程是系统进行资源...
java多线程处理大数据,可根据配置的线程数,任务去调度处理
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提高程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承`java.lang.Thread`类或实现`java.lang.Runnable`接口。 1. 继承Thread...
Java多线程编程是Java开发中的一项重要技术,它允许程序同时执行多个任务,提高了系统效率和响应速度。然而,多线程环境下的编程也带来了一些挑战,如数据同步、线程安全等问题。本文将重点讨论Java多线程编程中需要...
详解Java多线程处理List数据 Java多线程处理List数据是指在Java编程中,使用多线程技术来处理List数据的操作。这种操作可以提高程序的执行效率和性能,特别是在处理大规模数据时。下面将详细介绍Java多线程处理List...