在JDK5以前,Java线程实现互斥有两种方式:同步代码块和同步方法。
方式一:同步代码块
package tradition;
public class TraditionalThreadSynchronized {
public static void main(String[] args) {
new TraditionalThreadSynchronized().init();
}
private void init() {
//创建非静态内部类的对象必须依赖外部类的对象,
//而该方法的调用表明已经有了一个对象
final Outputer outputer = new Outputer();
new Thread(new Runnable(){
@Override
public void run() {
while(true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.ouput("zhangxiaoxiang");
}
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
while(true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.ouput("lihuoming");
}
}
}).start();
}
/**
* 自定义内部类
*/
class Outputer{
/**
* 打印字符串中的每个字符
* @param name
*/
public void ouput(String name) {
int len = name.length();
//synchronized使用的必须是同一个对象,最好使用字节码确保唯一
synchronized(Outputer.this) {
for(int i =0; i < len; i ++) {
System.out.print(name.charAt(i));
}
System.out.println();
}
}
}
}
package tradition;
public class TraditionalThreadSynchronized {
public static void main(String[] args) {
new TraditionalThreadSynchronized().init();
}
private void init() {
// 创建非静态内部类的对象必须依赖外部类的对象,
// 而该方法的调用表明已经有了一个对象
final Outputer outputer = new Outputer();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.ouput("zhangxiaoxiang");
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.ouput3("lihuoming");
}
}
}).start();
}
/**
* 自定义内部类
*/
static class Outputer {
/**
* 打印字符串中的每个字符,使用同步代码块
*
* @param name
*/
public void ouput(String name) {
int len = name.length();
// synchronized使用的必须是同一个对象
synchronized (Outputer.class) {
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println();
}
}
/**
* 打印字符串中的每个字符,
* 直接在方法上加synchronized,
* synchronized本质上用的也是this对象
*
* @param name
*/
public synchronized void ouput2(String name) {
int len = name.length();
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println();
}
/**
* 静态同步方法块
* @param name
*/
public static synchronized void ouput3(String name) {
int len = name.length();
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println();
}
}
}
上述代码中,output和output3可以实现同步,output2和output3无法实现同步,output和output2可以实现同步,注意有无static关键字的区别。