package com.CUPK.lsz.TraditionalThread;
//实现互斥的第一种方法:作为定义词修饰代码
public class TraditonalThreadSynchronized1 {
final Outputer outputer = new Outputer();
class Shower1 implements Runnable {
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outputer.output1("aaaaaaaaaaaaaaaa");
}
}
}
class Shower2 implements Runnable {
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//outputer.output1("bbbbbbbbbbbbbbbb");
outputer.output2("bbbbbbbbbbbbbbbb");
}
}
}
public void init() {
new Thread(new Shower1()).start();
new Thread(new Shower2()).start();
}
public static void main(String[] args) {
new TraditonalThreadSynchronized1().init();
}
class Outputer {
//如果output1锁xxx则不会和output2互斥,因为锁的不是同一个对象,output1为xxx,output2位Outputer
String xxx="";
public void output1(String name) {
int len = name.length();
synchronized(this/*xxx*/){
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
}
System.out.println();
}
/*public void output2(String name) {
int len = name.length();
synchronized(this){
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
}
System.out.println();
}*/
//output1与output2锁的是同一个对象Outputer,所以会互斥
public synchronized void output2(String name) {
int len = name.length();
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println();
}
//一个方法中最好只有一个锁,如下代码容易造成死锁
/*public synchronized void output1(String name) {
int len = name.length();
synchronized(this){
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
}
System.out.println();
}*/
}
}
java多线程编程入门之锁的使用
猜你喜欢
转载自blog.csdn.net/qq_40301016/article/details/81772595
今日推荐
周排行