package cn.itcast.demo;
public class TraditionalThreadSynchronizedDemo {
private static String xxx = "";
static class Outputer{
/*
* 这里的out1锁定的对象是this
*out2锁定的对象是this
* out3锁定的对象是Outputer.class这个对象
*
*/
//在方法里面加个synchronized的关键字也可以实现同步,这里锁定的对象是this
public synchronized void out1(String name)
{
//这里锁定的对象必须要是同一个对象,否则将会出现错误
//synchronized (this/*xxx*/) {
for (int i = 0; i < name.length(); i++) {
System.out.print(name.charAt(i));
}
System.out.println();
//}
}
public void out2(String name)
{
//这里锁定的对象必须要是同一个对象,否则将会出现错误,这里必须要是this,因为out1方法锁定的对象是this
synchronized (/*this*//*xxx*/Outputer.class) {
for (int i = 0; i < name.length(); i++) {
System.out.print(name.charAt(i));
}
System.out.println();
}
}
//这里锁定的对象其实是Outputer.class这个对象
public synchronized static void out3(String name)
{
//这里锁定的对象必须要是同一个对象,否则将会出现错误,这里必须要是this,因为out1方法锁定的对象是this
for (int i = 0; i < name.length(); i++) {
System.out.print(name.charAt(i));
}
System.out.println();
}
}
public void init()
{
//这里注意一点,内部类在实例化的时候一定要有外部类的实例才可以
/*TraditionalThreadSynchronizedDemo t = new TraditionalThreadSynchronizedDemo();
Outputer outputer = t.new Outputer();*/
final Outputer outputer = new Outputer();
new Thread(new Runnable(){
public void run() {
while(true)
{
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//内部类调用外部类的变量,该变量必须要是final类型的
outputer.out2("aaaaaaaa");
}
}
}).start();
new Thread(new Runnable(){
public void run() {
while(true)
{
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outputer.out3("bbbbbbbb");
}
}
}).start();
}
public static void main(String[] args) {
TraditionalThreadSynchronizedDemo t = new TraditionalThreadSynchronizedDemo();
t.init();
}
}