传统的线程互斥的一个例子
public class TraditionalThreadSynchronized {
public static void main(String[] args) {
TraditionalThreadSynchronized tts = new TraditionalThreadSynchronized();
tts.init();
}
//解决方法
private void init() {
//内部类不能访问局部变量,静态方法中不能new内部类的实例对象。所以以下这个语句不能放到main方法中
final Outputter out = new Outputter();
//线程一
new Thread(new Runnable() {
@Override
public void run() {
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
out.output("google");
}
}
}).start();
//线程二
new Thread(new Runnable() {
@Override
public void run() {
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
out.output("baidu");
}
}
}).start();
}
//内部类不能创建静态方法和静态变量
class Outputter {
public void output(String name) {
int len = name.length();
for(int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println("");
}
}
解决的方法一:
public void output(String name) {
int len = name.length();
synchronized(this) {
for(int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println("");
}
}
解决方法二:
public synchronized void output(String name) {
int len = name.length();
for(int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println("");
}
问题一:以下代码中output方法和output2方法该怎么才能避免线程的互斥,当同事调用这两个方法时。
static class Outputter {
public synchronized void output(String name) {
int len = name.length();
synchronized(this) {//解决方法是:给这两个方法一个共同的门栓,synchronized(TraditionalThreadSynchronized.class)
for(int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println("");
}
public static synchronized void output3(String name) {
int len = name.length();
for(int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println("");
}
}
小结:
线程的互斥,就是多个线程同事访问了共同的资源,当一个线程执行到一半的时候,另一个线程又来了,跑出执行另一个线程了,这样就会导致一些问题。
解决的方法就是:我们要为共同的资源使用synchronized来为他们加一把锁,当一个线程没有执行完退出是,其他的线程就只能等待他执行完成以后再去执行