您的位置:首页 > 其它

3.传统线程互斥技术

2015-07-10 11:07 281 查看
线程安全问题可以用银行转账来解释

/**
* 传统的线程互斥技术
* @author LiTaiQing
*/
public class TraditionalThreadSynchronized {

public static void main(String[] args){
new TraditionalThreadSynchronized().init();
}

private void init(){
/**
* 内部类访问局部变量,局部变量要加final
*         若此代码放在main中会报错,因为静态代码块不能访问内部类
*/
final Outputer outputer = new Outputer();
new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.output("zhangxiaoxiang");
}
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.output("lihuoming");
}
}
}).start();
}

static class Outputer{
public void output(String name){
int len = name.length();
/*
* 锁用任意一个对象都行,但只有同一个对象才具有互斥性
* 1.每个类的字节码文件只有一份,可以用来做互斥锁
* 2.用this也行
* 此处也可以在方法上架synchroized,
* 但从多线程效率角度来看,合理细化同步块粒度能提高执行效率,
* 所以此处在内部代码中加synchroized比较好
*/
synchronized(Outputer.class){
for(int i = 0; i < len ; i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
}
/**
* output2方法不会同步,因为方法上加synchronized相当于加this锁
* 但又是静态方法,所以this会失效,会出现问题。
* @param name
*/
public static synchronized void output2(String name){
int len = name.length();
synchronized(Outputer.class){
for(int i = 0; i < len ; i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: