IT程序员开发必备-各类资源下载清单,史上最全IT资源,个人收藏总结!
注意:
1.静态方法所使用的同步监视器对象是该类的字节码对象,如:Outputer.class
2.类非静态方法所使用的同步监视器对象时this,即类本实例对象
3.synchronized实现两个线程的synchronized代码块的内容不会被中断。保证synchronized代码块的原子性。
例子程序:
package edu.review;
public class TraditionalThreadSynchronized {
/**
* 结果:当Outputer的同一对象的两方法被两线程调用,是否会同步
* output1() output2() output3() output4()
* output1() 同步 同步 不同步 不同步
* output2() 同步 不同步 不同步
* output3() 同步 同步
* output4() 同步
**/
public static void main(String[] args) {
final Outputer outputer = new Outputer();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outputer.output1("zhangxiaoxiang");
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outputer.output4("lihuoming");
}
}
}).start();
}
static class Outputer{
public synchronized void output1(String name){
for (int i = 0; i < name.length(); i++) {
System.out.print(name.charAt(i));
}
System.out.println();
}
public void output2(String name){
synchronized(this){
for (int i = 0; i < name.length(); i++) {
System.out.print(name.charAt(i));
}
System.out.println();
}
}
public static synchronized void output3(String name){
for (int i = 0; i < name.length(); i++) {
System.out.print(name.charAt(i));
}
System.out.println();
}
public void output4(String name){
synchronized(Outputer.class){
for (int i = 0; i < name.length(); i++) {
System.out.print(name.charAt(i));
}
System.out.println();
}
}
}
}