Java线程之间控制占用临界资源(共享资源)用的最多就是synchronized,首先获得资源访问权的线程给资源对象加锁,使用完毕以后再释放对象锁。例如打印机的例子:
public class Printer { public void printLetters(char c) { for(int i = 0; i<5; i++) { System.out.print(c); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(); } }
主程序测试:
public class Test3 { public static void main(String[] args){ final Printer p = new Printer(); new Thread(){ public void run(){ p.printLetters('a'); } }.start(); new Thread(){ public void run(){ p.printLetters('b'); } }.start(); } }
执行结果为:
abbaababab
这样使用毫无疑问,打印的a和b会混杂在一起,因为没有加同步控制,两个线程可以任意使用打印机对象。解决办法就是在Printer类的printLetters方法前面加上synchronized关键字。加上以后某个线程会等待先占用打印机的线程使用完毕释放对象锁以后才能得到打印权。加上synchronized关键字以后的执行结果为:
aaaaa bbbbb
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
好了,比如打印机还有别的功能,看下面的例子:
public class Printer { synchronized public void printBigFile(){ System.out.println(Thread.currentThread().getName()+"打印大文件...."); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "打印大文件结束。。。"); } // public void anotherFunction() { // System.out.println("另外的非打印功能"); // } synchronized public void printLetters(char c) { for(int i = 0; i<5; i++) { System.out.print(c); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(); } }
主程序测试为:
public class Test3 { public static void main(String[] args){ final Printer p = new Printer(); new Thread(){ public void run(){ p.printLetters('a'); } }.start(); new Thread(){ public void run(){ p.printLetters('b'); } }.start(); //////////////////////////////////////////////////// new Thread(){ public void run(){ p.printBigFile(); } }.start(); new Thread(){ public void run(){ p.printBigFile(); } }.start(); // Thread.sleep(2000); // p.anotherFunction(); } }
执行结果为:
aaaaa Thread-3打印大文件.... Thread-3打印大文件结束。。。 Thread-2打印大文件.... Thread-2打印大文件结束。。。 bbbbb
可以看到printBigFile和printLetters之间也互斥了(它们也不能同时执行),正如上面所说的synchronized关键字锁住的是对象,而不是某个方法或者代码段。
再看上面两段代码中注释掉的部分,Printer类中注释掉的anotherFunction方法,以及在主函数中调用anotherFunction,因为anotherFunction没有加synchronized修饰,所以大概也能知道执行结果了,它打印的东西会夹在其它打印内容的中间,anotherFunction方法随时可以被任何线程同时执行。
相关推荐
线程同步是 Java 编程中的一种机制,用于控制多个线程之间的资源访问顺序,以避免线程之间的冲突和数据不一致。线程同步的目的就是避免线程“同步”执行,即让多个线程之间排队操作共享资源。 关于线程同步,需要...
Java 多线程同步中的两个特殊类 在Java语言中,有两个特殊的类用于多线程同步,分别是synchronized关键字和ReentrantLock类。 1. synchronized关键字 synchronized关键字是Java语言中的一种同步机制,用于对方法...
synchronized关键字是Java中实现线程同步的重要工具。通过本文的探讨,我们了解到了synchronized的工作原理、基本用法、以及在实际编程中的应用。合理使用synchronized可以有效地解决多线程环境下的并发问题,但也要...
Java提供了`synchronized`关键字来实现线程同步。当一个方法或代码块被`synchronized`修饰时,同一时刻只能有一个线程访问该区域。这样可以保证在多线程环境下的数据一致性。 并发是指多个任务在一段时间内交替执行...
"synchronized"关键字就是Java中实现线程同步的关键工具,它用于控制对共享资源的访问,防止出现数据不一致的情况。 标题中的"java 多线程synchronized互斥锁demo"指的是一个示例,展示了如何在多线程环境下使用`...
Java 锁机制 Synchronized 是 Java 语言中的一种同步机制,用于解决多线程并发访问共享资源时可能出现的一些问题。 Java 锁机制 Synchronized 的概念 在 Java 中,每个对象都可以被看作是一个大房子,其中有多个...
Java synchronized同步锁可以保证同一时刻只有一个线程操作同一资源,使用wait()、notify()切换线程状态保证线程操作的前后顺序实现线程交互。 Java线程状态有五种:新建状态、就绪状态、运行状态、休眠状态和死亡...
Java中的synchronized:同步方法与线程安全
Java 线程同步机制中 synchronized 关键字的理解 Java 的线程同步机制是为了解决多个线程共享同一片存储空间所带来的访问冲突问题。其中,synchronized 关键字是 Java 语言中解决这种冲突的重要机制。 ...
"Java 中 synchronized 用法详解" Synchronized 是 Java 语言中用于解决多线程共享数据...synchronized 关键字是 Java 语言中解决多线程共享数据同步问题的重要工具,但需要正确地使用它,以免造成死锁和系统开销。
Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源时的同步机制。在Java中,当多个线程试图同时访问和修改同一块代码或数据时,可能会导致数据不一致的问题。为了解决这个问题,...
在 Java 中,synchronized 关键字是一个非常重要的概念,它用于解决线程同步问题。但是,很多开发者对 synchronized 关键字的理解并不够深入,本文将通过实例解析 Java 中的 synchronized 关键字与线程平安问题,...
总之,Java多线程技术是软件开发中的重要技能,它涉及到线程池的使用、线程同步和通信等多个方面。通过学习和理解`MaxThreadCountTest`中的例子,开发者可以更好地掌握如何在实际项目中控制线程数量,优化程序性能,...
`synchronized`关键字是Java中实现线程同步的主要手段之一。这篇文档主要讨论了如何使用`synchronized`关键字来控制多线程对共享数据的访问。 首先,`synchronized`关键字有两种主要的用法:修饰实例方法和修饰代码...
3. **wait()和notify()方法**:这些方法是Object类的一部分,可以在`synchronized`代码块或方法中使用。`wait()`让当前线程等待,释放锁,直到其他线程调用`notify()`或`notifyAll()`唤醒它。`notify()`只会唤醒一个...
总之,`synchronized`关键字是Java中实现线程同步的关键手段,它可以确保共享数据在多线程环境中的正确性,但也需要谨慎使用,以避免可能导致的问题。在实际开发中,根据具体需求选择合适的方法来实现同步是至关重要...
在Java中,我们可以使用`synchronized`关键字来实现线程同步。 线程同步在Java中主要有两种实现方式: 1. **同步方法**:通过在方法声明前加上`synchronized`关键字,可以使得整个方法成为同步方法。这意味着每次...