解决线程安全问题

一(1).同步代码块:解决Runnable的线程安全问题

代码格式:

synchronized (同步监视器){

需要被同步的代码 //不能包含代码多了或者包含代码少了

}

被同步的代码:操作共享数据的代码
共享数据:多个线程共同操作的变量
同步监视器:俗称锁,任何一个类的对象都可以充当锁。

//同步监视器中可以用this充当锁

(2)解决继承Thread类的线程安全问题

synchronized (同步监视器){

需要被同步的代码

}
//随意造的一个对象必须是静态的statice,谨慎用this充当锁;但是可以用类.class充当锁


二(1)同步方法解决Runnable的线程安全问题

把需要被同步的代码抽离出来,再写一个方法放进去,在方法中加synchronized,并且在run方法中调此方法;把被同步的代码放进去。

private synchronized void show(){

}

(2)同步方法解决继承Thread的线程安全问题

把需要被同步的代码抽离出来,再写一个方法放进去,在方法中加synchronized,并且在run方法中调此方法,同时设置为静态方法,把被同步的代码放进去。

都涉及同步监视器,非静态同步方法中,同步监视器是this;静态方法中,同步监视器是但还能类本身

 

三(1)lock锁解决线程安全

首先实例化

class window implements Runnable{
    int ticket=100;
    private ReentrantLock lock =new ReentrantLock();//实例化

然后try finalry需要被同步的程序
 try {          //try 
                lock.lock();
                if (ticket > 0) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "售票口:" + ticket);
                    ticket--;
                } else {
                    break;
                }

            }finally {
                lock.unlock();

            }

调用锁定方法
 try {          //try
                lock.lock();  //调用锁
                if (ticket > 0) {

调用解锁方法
 finally {
                lock.unlock(); //解锁

            }
synchronized与lock的不同:lock需要手动的启动同步,以及手动结束同步,二sy在相应的代码执行完之后自动的释放同步监视器



posted @ 2020-11-03 21:41  兔兔1234  阅读(145)  评论(0)    收藏  举报