线程--同步代码块、同步方法实例
2017-11-06 13:22
393 查看
1、同步代码块
作用:开启四个线程共同操作卖10张票1.1、代码
package com.example; import com.sun.org.apache.xerces.internal.parsers.CachingParserPool; public class MySyncThread { public static void main (String [] args){ Ticket ticket = new Ticket(); //创建Ticket对象 //创建并开启四个线程 new Thread(ticket,"线程1").start(); new Thread(ticket,"线程2").start(); new Thread(ticket,"线程3").start(); new Thread(ticket,"线程4").start(); } } //定义Ticket类实现Runnable接口 class Ticket implements Runnable{ private int ticket = 10; // 定义变量tickets,并赋值10 Object lock =new Object();//定义任意一个对象,用作同步代码块的锁 @Override public void run() { while(true){ synchronized (lock){ //定义同步代码快 try{ Thread.sleep(10); //经过10S线程休眠 }catch (InterruptedException e){ e.printStackTrace(); } if(ticket >0){ System.out.println(Thread.currentThread().getName()+"---卖出的票"+ticket--); }else{ break; } } } } }
1.2、运行结果
线程1—卖出的票10
线程1—卖出的票9
线程1—卖出的票8
线程1—卖出的票7
线程4—卖出的票6
线程2—卖出的票5
线程3—卖出的票4
线程1—卖出的票3
线程1—卖出的票2
线程1—卖出的票1
当多个线程使用一个共享资源时,可以将处理共享资源的代码放置在一个代码块中,使用synchronized关键字修饰,被成为同步代码块,其格式如下:
synchronized(lock){
操作共享资源代码块
}
2、同步方法
2.1、代码package com.example; //创建一个线程类 class Ticket implements Runnable{ private int ticket = 10; @Override public void run () { while (true) { if(ticket > 0) { sellticket(ticket); ticket--; }else{ break; } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } //在前面修饰synchronized说明是一个同步的方法 synchronized private void sellticket(int ticket) { System.out.println(Thread.currentThread().getName()+"卖出的票号是:"+ticket); } } public class MySyncThreadMethod { public static void main (String [] args){ Ticket ticket = new Ticket(); //创建一个ticket对象 //开启四个线程 new Thread(ticket,"Thread_1").start(); new Thread(ticket,"Thread_2").start(); new Thread(ticket,"Thread_3").start(); new Thread(ticket,"Thread_4").start(); } }
2.2、运行结果:
Thread_1卖出的票号是:10
Thread_2卖出的票号是:9
Thread_3卖出的票号是:8
Thread_4卖出的票号是:7
Thread_1卖出的票号是:6
Thread_3卖出的票号是:5
Thread_2卖出的票号是:5
Thread_4卖出的票号是:3
Thread_1卖出的票号是:2
Thread_3卖出的票号是:1
同被synchronized关键字修饰的一样,被修饰的方法为同步方法:
synchronized 返回值类型 方法名([参数1],“`){}
参考文档:
Java基础入门 传智博客高教产品研发部
本人郑重声明,本博客所著文章、图片版权归权利人持有,本博只做学习交流分享所用,不做任何商业用途。访问者可將本博提供的內容或服务用于个人学习、研究或欣赏,不得用于商业使用。同時,访问者应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人的合法权利;如果用于商业用途,须征得相关权利人的书面授权。若以上文章、图片的原作者不愿意在此展示內容,请及时通知在下,將及时予以刪除。
相关文章推荐
- 112----关于线程中同步代码块,同步方法,以及同步锁的概念,区分什么是同步代码块
- Java线程同步、同步方法实例详解
- 写2个线程,一个打印1-52,一个打印A-Z,打印顺序是12A34B。。。(采用同步代码块和同步方法两种同步方法)
- 线程中的同步代码块synchronized、同步方法和同步锁Lock
- java线程的同步中notify和wait方法之生产消费实例讲解
- 关于java多线程中同步的问题(两个线程访问同一个实例类的两个同步方法,会不会互相影响)
- Java线程同步方法实例总结
- Java使用synchronized修饰方法来同步线程的实例演示
- 2.2.9同一个类的不同静态方法不同实例不同线程是同步的
- 线程(六)--线程同步--synchronized(同步代码块,同步方法)
- 【进程线程与同步】5.2 避免在同一机器上运行同一程序的多个实例
- 学习笔记--线程的几个常用方法实例
- 04.多线程--06.【同步方式在线程两种创建方式中的可行性】【同步代码块和同步函数的关系】【多线程程序设计思路总结】
- 线程类型和同步方法
- Java的synchronized的同步代码块和同步方法的区别
- java线程同步的方法总结
- 同时创建多个线程,它们都访问一个对象中的同步方法,怎么确保第一个线程最先拿到对象锁,否则,怎么保证多个线程之间的有序通信
- 使用异步方式调用同步方法(实例详解)
- java线程学习5——线程同步之同步方法
- Java集合HashSet-ArrayList-HashMap的线程同步控制方法和区别