Java多线程及线程安全详解(2)

public class SaleWindow implements Runnable {
    private int ticketCount = 10;
     //默认固定的锁对象this<br>        //将产生线程安全的代码封装到方法里并设置成同步方法
    public synchronized void syncB() {
        if (ticketCount > 0) {
            // 字符串拼接信息 变量+"" 就可以拼接成字符串
            System.out.println(Thread.currentThread().getName() + "卖出"
                    + ticketCount + "张票");
            ticketCount--;
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                // e.printStackTrace();
            }
        }
    }
 
    @Override
    public void run() {
        // TODO Auto-generated method stub
        // 多个窗口卖票
        for (int i = 0; i < 10; i++) {
            syncB();
        }
    }
 
}

结果图:

Java多线程及线程安全详解

最后结果每个窗口不能卖同样的票解决了线程安全问题

线程之间的通信

(ps:线程之间的通信和线程安全无关联二者不是一回事)

怎样才能让二个线程之间进行通信?

线程之间是相互独立的互不联系 而真正意义上的通信是通过中间件(同步锁 必须是同一把锁)来达到线程之间通信的目的

案例:二个线程来回交替输出一条数据(意思就是必须按照我说一句你说一句的这个规则走)

class BingB extends Thread {
    public void run(){
        for(int i = 0;i<5;i++){
            System.out.println("冰冰美,如花丑");
        }
    }
}
 
class RuH extends Thread{
    public void run(){
        for(int i = 0;i<5;i++){
            System.out.println("如花美,冰冰丑");
        }
    }
}
 
public class Test {
    public static void main(String[] args) {
        BingB bb = new BingB();
        RuH rh = new RuH();
        bb.start();
        rh.start();
    }
}

结果图:此结果不是交替出现的

Java多线程及线程安全详解

要想达到交替的目的代码如下:

class MyLock{
    static Object o = new Object();
}
 
class BingB extends Thread {
    public void run(){
        for(int i = 0;i<5;i++){
            //加锁(意思是必须等到本线程的任务代码执行完以后才去执行别的线程的代码)
            synchronized (MyLock.o) {
                System.out.println("冰冰美,如花丑");
                MyLock.o.notify();//唤醒另一个线程(这里表示如花线程)
                try {
                    MyLock.o.wait();//暂时彻底休眠本线程(不会自动唤醒 需要手动唤醒)  同时解锁  阻塞线程 代码就不会往下继续走  jvm会切换到另外一个线程中去
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                }
            }
        }
    }
}
 
class RuH extends Thread{
    public void run(){
        for(int i = 0;i<5;i++){
            synchronized (MyLock.o) {
                System.out.println("如花美,冰冰丑");
                MyLock.o.notify();//唤醒另一个线程(这里表示如冰冰程)
                try {
                    MyLock.o.wait();//暂时彻底休眠本线程  同时解锁  阻塞线程
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}
 
public class Test {
    public static void main(String[] args) {
        BingB bb = new BingB();
        RuH rh = new RuH();
        bb.start();
        rh.start();
    }
}

Java多线程及线程安全详解

多线程状态流程图:

Java多线程及线程安全详解

写到这里有关线程的基本讲解完毕,如果内容有我自己理解错误的地方还请各位大神指教,小弟不吝求教!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b145f80c36bfc6282167b1f511ace1ec.html