我们都知道传统的线程同步可以通过同步代码块或者同步方法来实现.
那么这里就牵扯到同步监视器的问题.
如果对同步监视器不了解的获取对线程相关知识不了解的, 可以查看博客http://blog.csdn.net/johnny901114/article/details/7536951
要想确保线程之间能够同步,那么监视器对象对于同步线程之间来说是同一个对象,这样才会起到同步互斥效果.
所以很多人使用字节码(class)最为同步对象,因为在内存中只存在一份某个类的字节码. 当然这很好,当这是对于一组同步函数而言的.
如果有多组函数呢?既然是多组,那么就有多个同步监视器对象,如果同步监视器使用同一个类的字节码,那么这样的话就成了一组同步函数.
下面的例子有两组同步函数头两个线程对print()进行同步互斥,后两个线程对printName()进行同步互斥;也就是他们两组是各干各的.互不影响的.
public synchronized static void print() {
//synchronized (ThreadGroup.class) {
String source = "我是中国人";
char[] cs = source.toCharArray();
System.out.println(Thread.currentThread().getName());
for (int j = 0; j < 30; j++) {
System.out.println(j + " -----------------> ");
for (int i = 0; i < cs.length; i++) {
System.out.print(cs[i]);
}
System.out.println();
}
//}
}
public synchronized static void printName() {
//synchronized (String.class) {
System.out.println(Thread.currentThread().getName());
String source = "你好吗";
char[] cs = source.toCharArray();
for (int j = 0; j < 30; j++) {
System.out.println(j+" -----------------> ");
for (int i = 0; i < cs.length; i++) {
System.out.print(cs[i]);
}
System.out.println();
}
//}
}
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
print();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
print();
}
}).start();
//--------------------------第二组
new Thread(new Runnable() {
@Override
public void run() {
printName();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
printName();
}
}).start();
}
因为print()和printName()都是static的,而且又有synchronized关键字修饰.所以同步监视器对象都是当前类的字节码.所以实际上以上只有一组同步函数.而不是两组
从输出结果可以看出,当一个线程执行了print()或printName()方法,其他3个线程只有等该线程执行完毕才能接着执行.
如果多组的话,一个组的同步互斥不会影响其他组的执行.
由于输出结果较多就不粘贴了.
把print()和printName()两个方法改成一下就是两组同步了.
public static void print() {
synchronized (ThreadGroup.class) {
String source = "我是中国人";
char[] cs = source.toCharArray();
System.out.println(Thread.currentThread().getName());
for (int j = 0; j < 30; j++) {
System.out.println(j + " -----------------> ");
for (int i = 0; i < cs.length; i++) {
System.out.print(cs[i]);
}
System.out.println();
}
}
}
public static void printName() {
synchronized (String.class) {
System.out.println(Thread.currentThread().getName());
String source = "你好吗";
char[] cs = source.toCharArray();
for (int j = 0; j < 30; j++) {
System.out.println(j+" -----------------> ");
for (int i = 0; i < cs.length; i++) {
System.out.print(cs[i]);
}
System.out.println();
}
}
}
从输出结果可以看出,两组同步是互相交替执行的.
转载请注明出处:http://blog.csdn.net/johnny901114/article/details/7854666
有什么错误不吝指正,谢谢!
分享到:
相关推荐
java线程同步java线程同步java线程同步
Java线程(二):线程同步synchronized和volatile 详细讲解Java 同步的原理技术资料
Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 ...
java线程第二版中英文 java线程第二版中英文 线程并不是新的概念:许多操作系统和语言都支持它们。在Java出现以前,似乎人人都在谈论线程,却很少有人使用它。用线程编程是技巧性很强的且不可移植。 而在Java中却...
java多线程同步互斥访问实例,对于初学者或是温故而知新的同道中人都是一个很好的学习资料
多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!
Java多线程同步论文.doc
Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的...
java线程同步实例,哲学家思考的代码实现,应该是一个比较好的例子
本代码是用JAVA实现的生产者与消费者的问题,线程间的同步与互斥功能
java 多线程同步方法的实例 java 多线程同步方法的实例 java 多线程同步方法的实例
JAVA代码采用线程来实现数据库的主从同步更新
Java线程:线程的同步 33 一、 同步方法 35 二、 同步块 36 三、 volatile关键字 38 四、 使用synchronized关键字要注意以下四点 39 五、 关于同步和锁定的一些问题 41 Java线程:并发协作-线程的交互 47 Java线程:...
Java多线程同步具体实例.doc
java线程同步
Java线程及同步(synchronized)样例代码
java多线程同步分析java多线程同步分java多线程同步分析析java多线程同步分析java多线程同步分析
Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的...
Java多线程同步.pdf