首页>>后端>>java->详解Java线程的同步方法

详解Java线程的同步方法

时间:2023-11-30 本站 点击:1

内部锁: synchronized 关键字

Java 中的每个对象都有一个与之关联的内部锁(Intrinsic lock). 这种锁也称为监视器(Monitor), 这种内部锁是一种排他锁,可以保障原子性,可见性与有序性.

内部锁是通过 synchronized 关键字实现的.synchronized 关键字修饰代码块,修饰该方法.

修饰代码块的语法:

synchronized(对象锁){同步代码块,可以在同步代码块中访问共享数据}

修饰实例方法就称为同步实例方法

修饰静态方法称称为同步静态方法

上篇文章说了synchronized同步代码块,今天来说说线程的同步方法

2、同步方法

packagecom.wkcto.intrinsiclock;/***synchronized同步实例方法*把整个方法体作为同步代码块*默认的锁对象是this对象*Author:老崔*/publicclassTest05{publicstaticvoidmain(String[]args){//先创建Test01对象,通过对象名调用mm()方法Test05obj=newTest05();//一个线程调用mm()方法newThread(newRunnable(){@Overridepublicvoidrun(){obj.mm();//使用的锁对象this就是obj对象}}).start();//另一个线程调用mm22()方法newThread(newRunnable(){@Overridepublicvoidrun(){obj.mm22();//使用的锁对象this也是obj对象,可以同步//newTest05().mm22();//使用的锁对象this是刚刚new创建的一个新对象,不是同一个锁对象不能同步}}).start();}//定义方法,打印100行字符串publicvoidmm(){synchronized(this){//经常使用this当前对象作为锁对象for(inti=1;i<=100;i++){System.out.println(Thread.currentThread().getName()+"-->"+i);}}}//使用synchronized修饰实例方法,同步实例方法,默认this作为锁对象publicsynchronizedvoidmm22(){for(inti=1;i<=100;i++){System.out.println(Thread.currentThread().getName()+"-->"+i);}}}
packagecom.wkcto.intrinsiclock;/***synchronized同步静态方法*把整个方法体作为同步代码块*默认的锁对象是当前类的运行时类对象,Test06.class,有人称它为类锁*Author:老崔*/publicclassTest06{publicstaticvoidmain(String[]args){//先创建Test01对象,通过对象名调用mm()方法Test06obj=newTest06();//一个线程调用m1()方法newThread(newRunnable(){@Overridepublicvoidrun(){obj.m1();//使用的锁对象是Test06.class}}).start();//另一个线程调用sm2()方法newThread(newRunnable(){@Overridepublicvoidrun(){Test06.sm2();//使用的锁对象是Test06.class}}).start();}//定义方法,打印100行字符串publicvoidm1(){//使用当前类的运行时类对象作为锁对象,可以简单的理解为把Test06类的字节码文件作为锁对象synchronized(Test06.class){for(inti=1;i<=100;i++){System.out.println(Thread.currentThread().getName()+"-->"+i);}}}//使用synchronized修饰静态方法,同步静态方法,默认运行时类Test06.class作为锁对象publicsynchronizedstaticvoidsm2(){for(inti=1;i<=100;i++){System.out.println(Thread.currentThread().getName()+"-->"+i);}}}
packagecom.wkcto.intrinsiclock;/***同步方法与同步代码块如何选择*同步方法锁的粒度粗,执行效率低,同步代码块执行效率高**Author:老崔*/publicclassTest07{publicstaticvoidmain(String[]args){Test07obj=newTest07();newThread(newRunnable(){@Overridepublicvoidrun(){obj.doLongTimeTask();}}).start();newThread(newRunnable(){@Overridepublicvoidrun(){obj.doLongTimeTask();}}).start();}//同步方法,执行效率低publicsynchronizedvoiddoLongTimeTask(){try{System.out.println("TaskBegin");Thread.sleep(3000);//模拟任务需要准备3秒钟System.out.println("开始同步");for(inti=1;i<=100;i++){System.out.println(Thread.currentThread().getName()+"-->"+i);}System.out.println("Taskend");}catch(InterruptedExceptione){e.printStackTrace();}}//同步代码块,锁的粒度细,执行效率高publicvoiddoLongTimeTask2(){try{System.out.println("TaskBegin");Thread.sleep(3000);//模拟任务需要准备3秒钟synchronized(this){System.out.println("开始同步");for(inti=1;i<=100;i++){System.out.println(Thread.currentThread().getName()+"-->"+i);}}System.out.println("Taskend");}catch(InterruptedExceptione){e.printStackTrace();}}}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/java/4975.html