栏目导航
热点推荐
- 三十条有用的 Java 编程规则
- Java制作水印图片源码
- Java常见异常及可能的导致原因
- Java中的修饰词使用方法总结
- J2EE系统异常的处理准则
- Java中的异常、断言、日志解析(
- Java面试技巧:Java面试题集锦(
- 面向Java开发人员的Scala指南:
- Java程序员:一刻钟精通正则表达
- 网友经验分享:学好java开发的关
- 专家解答:创建表格与数据库进行
- Java远程访问Domino数据库
阅览排行
Java多线程编程中的线程同步Synchronized
www.jz123.cn 2010-01-13 来源: 我要投递新闻
Synchronized,顾名思义,代表线程同步。那么,在java编程中如何使用它呢?
我们首先来看这样一个情况:对于同一个变量synDemo,我们分别在2个不同的线程中调用synDemo.synMethord1()与synDemo.synMethord2()。
package com.cnblogs.gpcuster;/** * * @author Aaron.Guo * */ public class Tester {public static void main(String[] args) {final SynDemo synDemo = new SynDemo();Thread thread1 = new Thread() {@Overridepublic void run() {// TODO Auto-generated method stub super.run();synDemo.synMethord1();}};Thread thread2 = new Thread() {@Overridepublic void run() {// TODO Auto-generated method stub super.run();synDemo.synMethord2();}};thread1.start();thread2.start();while (true) {try {Thread.sleep(1000);System.out.println("main");} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace(); } } } } 我们的SynDemo是这样定义的: package com.cnblogs.gpcuster;/** * * @author Aaron.Guo * */ public class SynDemo{public void synMethord1() {while(true) {try {Thread.sleep(1000);System.out.println("synMethord1");} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace(); } } } public void synMethord2() {while(true) {try {Thread.sleep(1000);System.out.println("synMethord2");} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace(); } } } } |
我们的SynDemo对象没有任何特殊的定义,所以运行起来以后的情况如下:
synMethord2 synMethord1 main synMethord2 synMethord1 main synMethord2 synMethord1 |
接下来,我们给synMethord1添加上synchronized声明,运行情况还是与上次一样,因为我们只有一个线程在调用synMethord1的方法。
我们给synMethord2也添加上synchronized声明,SynDemo对象的代码修改为:
package com.cnblogs.gpcuster;/** * * @author Aaron.Guo * */ public class SynDemo{public synchronized void synMethord1() {while(true) {try {Thread.sleep(1000);System.out.println("synMethord1");} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace(); } } } public synchronized void synMethord2() {while(true) {try {Thread.sleep(1000);System.out.println("synMethord2");} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace(); } } } } |
这个时候,我们再运行程序,结果就不一样了:
main synMethord1 main synMethord1 main synMethord1 |
0
上一篇:Java多线程优化之偏向锁原理分析 下一篇:Java Serializable(序列化)的理解和总结