首页 > 编程知识 正文

进程同步问题解题思路(【多线程】线程同步问题的三种解决方法)

时间:2023-05-05 03:29:35 阅读:123821 作者:687

目录一、序言二、同步码块三、同步方法四、锁定方法五、总结

一、前言

有三种方法可以解决线程同步问题。同步代码块同步方法,http://www.Sina.com/(JDK5新功能)。

要使用同步解决线程同步问题,请始终注意。 特别是在继承和创建多线程时更要小心。

二、同步代码块使用同一个同步监视器

同步监视器需要同步的代码) } 1、语法

需要同步的代码是操作2、对语法的说明的代码

同步监视器可以是任何类的对象,但可以是共享数据

在多线程的情况下,通常使用必须是唯一的作为同步监视器。 继承多线程时,通常使用类名. class作为同步监视器

this

代码背景:创建两个窗口,总票数为100张,通过实现Runnable接口创建多线程

publicclassticketimplementsrunnable {私有int ticket=100; @Override public void run (() while ) ) { //ticket是共享数据,其中包装//同步监视器可以是任何类的对象,但必须是唯一的。 由于只有一个对象实现Runnable,因此在此使用this作为同步监视器的同步(this ) if(ticket0) system.out.println ) thread } else { break; }}//测试类public class test { publicstaticvoidmain (string [ ] args ) { Ticket ticket=new Ticket; threadT1=newthread(Ticket ); threadT2=newthread(Ticket ); t1 .开始(; T2 .开始(; }} 3、代码演示

这样做是线程安全的,但在同步代码块中,线程以单线程方式运行,4、总结

三.同步方法效率会降低

公共同步void方法名称(() /操作共享数据的代码) } 1、语法

同步方法涉及同步监视器,但不需要显式声明

非静态同步方法,同步监视器为2、对语法的说明

静态同步方法,同步监视器为this

当前类本身

publicclassticketextendsthread { privatestaticintticket=100; @Override public void run () while (true ) ) { demo ); if(ticket==0) { break; }//因为处理共享数据的方法正好在此方法中,所以将此方法声明为同步的//必须是唯一的,因为同步监视器。 因此,将该方法定义为static的privatestaticsynchronizedvoiddemo () if(ticket0) system.out.println (thread.current thread ) ).geeread (四、Lock方法3、代码演示

实例化ReentrantLock对象

用try块解除锁定

在finally块中关闭锁定

1、步骤

publicclassticketextendsthread { privatestaticintticket=100; ReentrantLock对象专用taticreentrantlock=newreentrantlock (; @Override public void run () while (try )lock.lock ); if(Ticket0) system.out.println ) getname () '票号为:' ticket ); ticket--; } else { break; } } finally {//lock.unlock (); }}五、总结2、代码演示

同:可以解决线程安全问题

不同:、锁定需要手动打开/关闭锁定,但同步会退出范围并自动关闭锁定

、使用Lock锁,JVM可以在很少的时间内调度线程,性能好,可扩展性好

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。