Java多线程之传统线程互斥技术

    xiaoxiao2021-11-12  52

    package javaplay.thread.test; public class TraditionalThreadSynchronized { public static void main(String[] args) { new TraditionalThreadSynchronized().init(); } private void init() { final Outputer outputer = new Outputer(); new Thread(new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } outputer.output("zhangxiaoxiang"); } } }).start(); new Thread(new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } outputer.output3("liheming"); } } }).start(); // output:lzhihemingangxiaoxiang } static class Outputer { String xxx = ""; public void output(String name) { int len = name.length(); // 此处name是不行的 还是会输出:zliheminghangxiaoxiang // 互斥一定是同一个对象才行 如xxx就可以 // 但用xxx时 调用方用new Output().output("");就不行了 // 要是同一个对象才能用xxx 同一个对象才能保证xxx是同一个 此时 // 还可以用this 即 synchronized(this) synchronized (this) {// name for (int i = 0; i < len; i++) { System.out.print(name.charAt(i)); } System.out.println(); } } // 如果要保护的是一个方法 那就在方法前面加synchronized // 方法上的synchronized用的就是this,即此时output2与output是互斥的 public synchronized void output2(String name) { int len = name.length(); // 如果里面再加一个synchronized就有可能出现死锁 for (int i = 0; i < len; i++) { System.out.print(name.charAt(i)); } System.out.println(); } // 此时output与output3不同步 要想同步就要把output中的this改成Ouputer.class // 静态方法所使用的同步监视器对象只能是字节码 public static synchronized void output3(String name) { int len = name.length(); // 如果里面再加一个synchronized就有可能出现死锁 for (int i = 0; i < len; i++) { System.out.print(name.charAt(i)); } System.out.println(); } //线程的互斥就是要用synchronized,synchronized就是要检查同一把锁对象,多个线程要同步 //必须要用同一把锁,不同的锁不可以 } }

     

    转载请注明原文地址: https://ju.6miu.com/read-678217.html

    最新回复(0)