1 public class TraditionalThreadSynchronized { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 new TraditionalThreadSynchronized().init(); 8 } 9 10 private void init() { 11 /** 12 * 静态方法中不能NEW内部类的实例对象 13 * 内部类可以访问外部类的成员变量,对象创建完了,成员变量才分配空间 14 * Outputer在静态方法中创建的时候还没有TraditionalThreadSynchronized对象 15 */ 16 final Outputer outputer = new Outputer(); 17 new Thread(new Runnable() { 18 @Override 19 public void run() { 20 while (true) { 21 try { 22 Thread.sleep(10); 23 } 24 catch (InterruptedException e) { 25 e.printStackTrace(); 26 } 27 outputer.output("wunanjie1234"); 28 } 29 30 } 31 }).start(); 32 33 new Thread(new Runnable() { 34 @Override 35 public void run() { 36 while (true) { 37 try { 38 Thread.sleep(10); 39 } 40 catch (InterruptedException e) { 41 e.printStackTrace(); 42 } 43 outputer.output2("lihuoming1234"); 44 } 45 46 } 47 }).start(); 48 49 } 50 51 /** 52 * 53 * @描述: 将名字打印在控制台上 . 54 * 加static相当于外部类 55 * @作者: Wnj . 56 * @创建时间: 2017年5月15日 . 57 * @版本: 1.0 . 58 */ 59 static class Outputer { 60 61 /** 62 *打印错乱 63 * wunanlihuoming1234 64 * jie1234 65 66 67 * 要实现原子性 68 * 当有一个线程在执行该方法的时候,其它线程不能执行 69 * <功能详细描述> 70 * @param name 71 */ 72 public void output(String name) { 73 int len = name.length(); 74 //把你要保护起来的代码用synchronized关键字保护起来,进行排它性,只有当这个线程出来后,其它线程才能进去 75 //锁一定要是同一个对象 76 synchronized (Outputer.class) { 77 for (int i = 0; i < len; i++) { 78 System.out.print(name.charAt(i)); 79 } 80 System.out.println(); 81 } 82 } 83 84 public synchronized void output2(String name) { 85 int len = name.length(); 86 for (int i = 0; i < len; i++) { 87 System.out.print(name.charAt(i)); 88 } 89 System.out.println(); 90 } 91 /** 92 * 类的字节码在内存中也算是一份对象,静态方法运行的时候不需要创建类的实例对象,使用Outputer.class字节码就可以进行互斥 93 * <功能详细描述> 94 * @param name 95 */ 96 public static synchronized void output3(String name) { 97 int len = name.length(); 98 for (int i = 0; i < len; i++) { 99 System.out.print(name.charAt(i)); 100 } 101 System.out.println(); 102 } 103 } 104 }
时间: 2024-10-05 18:36:43