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基础入门 传智博客高教产品研发部
本人郑重声明,本博客所著文章、图片版权归权利人持有,本博只做学习交流分享所用,不做任何商业用途。访问者可將本博提供的內容或服务用于个人学习、研究或欣赏,不得用于商业使用。同時,访问者应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人的合法权利;如果用于商业用途,须征得相关权利人的书面授权。若以上文章、图片的原作者不愿意在此展示內容,请及时通知在下,將及时予以刪除。