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中的synchronized:同步方法与线程安全
synchronized下的方法控制多线程程序中的线程同步非常方便,这里就来看一下Java使用synchronized修饰方法来同步线程的实例演示,需要的朋友可以参考下
java的线程同步机制synchronized关键字的理解_.docx
基于Java synchronized同步锁实现线程交互.pdf
多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!
Java线程及同步(synchronized)样例代码
Java线程(二):线程同步synchronized和volatile 详细讲解Java 同步的原理技术资料
四、 使用synchronized关键字要注意以下四点 39 五、 关于同步和锁定的一些问题 41 Java线程:并发协作-线程的交互 47 Java线程:并发协作-生产者消费者模型 52 Java线程:并发协作-死锁 55 Java线程:线程之间的...
线程同步(synchronized)1---马克-to-win java视频 java视频
NULL 博文链接:https://wuaner.iteye.com/blog/998696
主要介绍了Java多线程synchronized同步方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
java多线程每个线程挨着打印ABC的4种实现...里面一共有4中实现方式,实现线程间同步和通信问题,有synchronized实现也有ReentrantLock的实现,还有不用任何锁和同步的实现。欢迎大家一起交流,使用更多的方法来实现。
主要介绍了深入解析Java并发编程中线程的同步与线程锁的使用,synchronized和lock是Java中最常见的控制线程的方法,需要的朋友可以参考下
Java的synchronized关键字可以修饰方法和对象来构建线程间的同步,这里我们就来共同学习Java多线程编程中synchronized线程同步的教程:
文件简述了java中线程同步的具体用法,希望能对您有点小用,不足之处,请您喷。
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
1、在系统中对访类要使用多线程进行访问; 2、在该类中有 类变量,或者是 在类的方法中有访问公共资源(如一个外部文件的读写)。 同步锁锁定的内容是什么? 无论你将Synchronized加在方法前还是加在...
java 多线程同步详解 synchronized 的使用,锁定对象 ,锁定类 区别