您的位置:首页 > 编程语言

线程--同步代码块、同步方法实例

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基础入门 传智博客高教产品研发部 

本人郑重声明,本博客所著文章、图片版权归权利人持有,本博只做学习交流分享所用,不做任何商业用途。访问者可將本博提供的內容或服务用于个人学习、研究或欣赏,不得用于商业使用。同時,访问者应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人的合法权利;如果用于商业用途,须征得相关权利人的书面授权。若以上文章、图片的原作者不愿意在此展示內容,请及时通知在下,將及时予以刪除。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程
相关文章推荐