展示一下线程同步问题,创建两个线程,执行同一个对象的输出方法。
public class PrintChar { public void output(String name) { try { for (int i = 0; i < name.length(); i++) { System.out.print(name.charAt(i)); Thread.sleep(1); } } catch (InterruptedException e) { } } }
public static void main(String[] args) { final PrintChar printer = new PrintChar(); new Thread() { public void run() { printer.output("aaaaa"); }; }.start(); new Thread() { public void run() { printer.output("bbbbb"); }; }.start(); }
运行结果:
abababbaba
显然输出的字符串被打乱了,我们期望的输出结果是aaaaabbbbb,这就是线程同步问题,我们希望output方法被一个线程完整的执行完之后再切换到下一个线程。Java中使用锁机制保证一段代码在多线程执行时是互斥的。
一,内置锁:synchronized关键字。
Java中使用synchronized保证一段代码在多线程执行时是互斥的,有两种用法:
1. 使用synchronized将需要互斥的代码包含起来,并上一把锁。
public class PrintChar { public void output(String name) { try { synchronized (this) { for (int i = 0; i < name.length(); i++) { System.out.print(name.charAt(i)); Thread.sleep(1); } } } catch (InterruptedException e) { } } }
这把锁必须是需要互斥的多个线程间的共享对象,像下面的代码是没有意义的。
public class PrintChar { public void output(String name) { try { Object obj = new Object(); synchronized (obj) { for (int i = 0; i < name.length(); i++) { System.out.print(name.charAt(i)); Thread.sleep(1); } } } catch (InterruptedException e) { } } }
每次进入该代码块都会创建一个新的obj,这个锁显然每个线程都会创建,没有意义。
2. 将synchronized加在需要互斥的方法上。
public class PrintChar { public synchronized void output(String name) { try { for (int i = 0; i < name.length(); i++) { System.out.print(name.charAt(i)); Thread.sleep(1); } } catch (InterruptedException e) { } } }
这种方式就相当于用this锁住整个方法内的代码块,如果用synchronized加在静态方法上,就相当于用××××.class锁住整个方法内的代码块。使用synchronized在某些情况下会造成死锁。使用synchronized修饰的方法或者代码块可以看成是一个原子操作。
每个锁都有两个队列,一个是就绪队列,一个是阻塞队列,就绪队列存储了将要获得锁的线程,阻塞队列存储了被阻塞的线 程,当一个线程被唤醒(notify)后,才会进入到就绪队列,等待CPU的调度,反之,当一个线程被wait后,就会进入阻塞队列,等待下一次被唤醒, 这个涉及到线程间的通。看我们的例子,当第一个线程执行输出方法时,获得同步锁,执行输出方法,恰好此时第二个线程也要执行输出方 法,但发现同步锁没有被释放,第二个线程就会进入就绪队列,等待锁被释放。一个线程执行互斥代码过程如下:
1. 获得同步锁;
2. 清空工作内存;
3. 从主内存拷贝对象副本到工作内存;
4. 执行代码(计算或者输出等);
5. 刷新主内存数据;
6. 释放同步锁。
所以,synchronized既保证了多线程的并发有序性,又保证了多线程的内存可见性。
相关推荐
Java 线程同步机制中 synchronized 关键字的理解 Java 的线程同步机制是为了解决多个线程共享同一片存储空间所带来的访问冲突问题。其中,synchronized 关键字是 Java 语言中解决这种冲突的重要机制。 ...
本文深入探讨了Java中用于解决并发编程中线程安全问题的synchronized关键字。文章首先讨论了多线程编程中临界资源的概念,包括对象、变量、文件等,以及同步机制的必要性。重点解析了synchronized的工作原理,包括其...
2. **可见性**:JMM通过`volatile`关键字、synchronized关键字等手段来确保一个线程对共享变量的修改可以被其他线程及时看到。 3. **有序性**:JMM通过`volatile`关键字和`synchronized`块等机制来确保指令的执行...
java多线程中synchronized关键字的用法 解压密码 www.jiangyea.com
并发编程是多线程环境下确保程序正确性的关键技术,而Java中的`synchronized`关键字则是实现并发控制的重要工具。`synchronized`关键字可以用于修饰方法或作为同步代码块,其核心目标是保证线程对共享资源的访问具有...
Java 线程 volatile 关键字详解 Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。volatile 变量的同步性较差,但它有时更简单并且开销更低。volatile 变量可以被看作是一种 “程度较轻的 ...
Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源时的同步机制。在Java中,当多个线程试图同时访问和修改同一块代码或数据时,可能会导致数据不一致的问题。为了解决这个问题,...
Java 中的 synchronized 关键字与线程平安问题 在 Java 中,synchronized 关键字是一个非常重要的概念,它用于解决线程同步问题。但是,很多开发者对 synchronized 关键字的理解并不够深入,本文将通过实例解析 ...
synchronized关键字是Java中实现线程同步的重要工具。通过本文的探讨,我们了解到了synchronized的工作原理、基本用法、以及在实际编程中的应用。合理使用synchronized可以有效地解决多线程环境下的并发问题,但也要...
一、synchronized关键字的作用与原理 `synchronized`关键字主要有两个作用:同步方法和同步块。它通过锁机制来实现线程同步,防止多个线程同时执行同一段代码,可能导致的数据不一致问题。 1. 同步方法:当在方法...
Synchronized 关键字是 Java 并发编程中最基本的同步机制,它可以保证线程安全,包括原子性、可见性和有序性。Synchronized 关键字可以修饰方法或代码块,使得在同一时刻只有一个线程可以执行该方法或代码块,从而...
"Java 多线程与并发(4-26)-关键字- synchronized详解" Java 多线程与并发中的 synchronized 关键字是实现同步块的互斥访问和线程的阻塞及唤醒等工作的重要工具。下面将对 synchronized 关键字进行详细分析。 ...
【深入讲解Java线程与synchronized关键字】 Java中的多线程同步是通过对象锁机制来实现的,synchronized关键字正是这一机制的关键。它确保了在任何时刻,只有一个线程能够访问特定的共享资源,从而避免数据不一致的...
Java 中的 synchronized 关键字是用于解决多线程并发问题的重要工具之一。它可以被用于方法、代码块和变量上,以实现对共享资源的互斥访问控制。本文将对 Java 中的 synchronized 用法进行详细的解释和分析。 一、...
Java中的`synchronized`关键字是用于实现线程同步的关键机制,它的主要目的是确保在多线程环境中,对共享资源的访问能够保持数据的一致性和完整性。本文将深入探讨`synchronized`的两种主要用法:synchronized方法和...
在Java编程语言中,`synchronized`关键字是用于实现线程同步的重要机制,它确保了在多线程环境中的数据一致性与安全性。本篇将详细解析`synchronized`的关键特性和使用方法,帮助开发者深入理解如何在并发编程中有效...
线程安全,使用synchronized关键字
### synchronized关键字的深入解析 #### 一、synchronized关键字的重要性 `synchronized`关键字在Java语言中扮演着极其重要的角色,它是实现线程安全的核心手段之一。通过`synchronized`关键字,开发人员可以在多...
synchronized关键字是Java中实现线程同步的基本工具,它通过锁定对象的monitor来控制对共享资源的并发访问。理解synchronized的工作原理和使用方式对于编写线程安全的Java程序至关重要。然而,由于其局限性,开发者...