JAVA--线程同步的三种方法
一、使用synchronized实现同步代码块
格式:
class MyThread4 implements Runnable{private int ticket=100;Integer key=new Integer(10086);@Overridepublic void run() {while(true){synchronized(key){if(ticket>0){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+":"+ticket);ticket--;}elsebreak;}}}}
public class ThreadTest4 {public static void main(String[] args) {MyThread4 myThread4 = new MyThread4();Thread th1 = new Thread(myThread4);Thread th2 = new Thread(myThread4);Thread th3 = new Thread(myThread4);th1.start();th2.start();th3.start();}
}
二、使用synchronized实现同步方法
格式:
class MyThread5 implements Runnable{private int ticket=100;@Overridepublic void run() {while(true){show();if(ticket<=0)break;}}private synchronized void show() {if(ticket>0){System.out.println(Thread.currentThread().getName()+":"+ticket);ticket--;try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}
}
public class ThreadTest5 {public static void main(String[] args) {MyThread5 myt = new MyThread5();Thread th1=new Thread(myt);Thread th2=new Thread(myt);Thread th3=new Thread(myt);th1.start();th2.start();th3.start();}
}
注意:
1、使用synchronized关键字实现多线程同步的关键是保证其中synchronized(对象)中对象的一致;
2、其中同步方法中无static修饰的对象是当前对象本身(this),有static修饰的是类本身;
三、使用Loct手动实现同步
格式:
}
}
import java.util.concurrent.locks.ReentrantLock;class MyThread10 implements Runnable{private int ticket=100;private ReentrantLock lock=new ReentrantLock();@Overridepublic void run() {while(true){try {lock.lock();if (ticket > 0) {System.out.println(Thread.currentThread().getName() + ":" + "售出第" + show()+ "张票成功");ticket--;try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}} elsebreak;} finally {lock.unlock();}}}private int show(){return 101-ticket;}
}
public class ThreadTest10 {public static void main(String[] args) {MyThread10 meh=new MyThread10();Thread th1=new Thread(meh);Thread th2=new Thread(meh);Thread th3=new Thread(meh);th1.setName("窗口一");th2.setName("窗口二");th3.setName("窗口三");th1.start();th2.start();th3.start();}
}
JAVA--线程同步的三种方法相关推荐
- unix c线程同步的三种方法:互斥量、读写锁以及条件变-xhb8413-ChinaUnix博客
unix c线程同步的三种方法:互斥量.读写锁以及条件变-xhb8413-ChinaUnix博客 unix c线程同步的三种方法:互斥量.读写锁以及条件变 2012-03-30 14:42:38 分类 ...
- java线程同步的7种方法
为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有 ...
- 实现Java线程同步的五种方法
线程同步概念 Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),将会导致数据不明确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的 ...
- java线程同步的五种方法
2019独角兽企业重金招聘Python工程师标准>>> 1.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, ...
- linux c 线程同步的三种方法
目录 一.互斥锁(mutex) 二.条件变量(cond) 三.信号量(sem) 线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用 ...
- Linux 线程同步的三种方法
程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 通过锁机制实现线程间的同 ...
- Linux C线程同步的三种方法
void* thr_fn1() {printf ("111111"); }int main() {int err;pthread_t tid;void *tret;err = pt ...
- linux:线程同步的5种方法
linux:线程同步的5种方法 一.为什么要使用线程: 二.线程同步的5种方法 2.1 互斥量 2.2 读写锁 2.3 条件变量 2.4 自旋锁 2.5 屏障 一.为什么要使用线程: <1> ...
- java多线程同步的四种方法_java中实现多线程的两种方法
java多线程有几种实现方法,都是什么?同步有几种实java中多线程的实现方法有两种:1.直接继承thread类:2.实现runnable接口:同步的实现方法有五种:1.同步方法:2.同步代码块:3. ...
- Java线程同步的几种方式
Java线程同步的几种方式 1.使用synchronized关键字 它的工作是对同步的代码加锁,使得每一次只能有一个线程进入同步块,从而保证线程间的安全性. synchronized关键字的用法: ...
最新文章
- 【Android 逆向】Android 系统文件分析 ( 根目录下的目录和文件 | /data/ 应用和用户数据目录 | /mnt/ 挂载其它设备目录 )
- SpringMVC之Http标准的头部信息
- [?]Oracle 10g sqlplus 的Bug?
- HTTP一个 TCP 连接可以发多少个 HTTP 请求等面试题
- 【POJ - 3037】Skiing (Dijkstra算法)
- 华为联发科可以升级鸿蒙吗,华为鸿蒙系统降临!首批升级手机确定,联发科芯片被放弃?...
- Lc.exe已退出 代码为-1
- python初学者怎么入门-终于晓得python入门后怎么学精
- 编程学习记录1:编程的一些简单概念
- jwt token and shiro
- leetcode-337-打家劫舍三*
- u盘安全弹出有什么用?数据丢失还能恢复吗
- 支付宝企业转账到个人账号(php源码,亲测)
- 西工大java高级网络编程_西工大16春《JAVA高级网络编程》平时作业
- VMware vCenter Converter 物理机迁移
- hadoop入门6:hadoop查询两两之间有共同好友,及他俩的共同好友都是谁
- routeDone with a webviewId 12 that is not the current page(env: Windows,mp,1.06.2301040; lib: 2.30.0
- 最简单的单例模式,Go版本的实现你写对了吗?
- 利用计算机审计新闻,计算机审计显身手 审计员钻出账本堆被审单位麻烦减少...
- 一个08届毕业的学长写给即将毕业的09届的学弟学妹们
热门文章
- 微信小程序——获取openid
- Java中的数组利用键盘输入求平均数
- 最小生成树Prim算法java实现
- 神经网络(九)无监督学习
- scanf()函数的使用
- 室内定位技术:分类、方法与应用综述
- db2 replace函数的用法_48R软件数据的基本处理之删除重复数据(duplicated()、unique()、distinct()函数)...
- 机器学习--多层感知机、卷积神经网络、循环神经网络
- 管理学十二(流程与制度的重要性)
- Ubuntu(debian)问题解决方案合集