java如何解决线程安全问题
- 方式一:同步代码块
synchroized(同步监视器的对象){
需要被同步的代码
}
package threadtest;
//使用同步代码块实现Runable接口的线程
public class Ruanble { public static void main(String[] args) {
//创建实现类的对象
Num num=new Num();
//将此对象作为参数传递给Thread类的构造器,创建Thread类的对象
Thread thread1 =new Thread(num);
Thread thread2 =new Thread(num);
Thread thread3 =new Thread(num);
//调用start()启动创建的Thread对象 thread1.setName("线程一");
thread2.setName("线程二");
thread3.setName("线程三"); thread1.start();
thread2.start();
thread3.start();
}
}
//创建一个类实现Runable接口
class Num implements Runnable{
int ticket=100;
//定义同步监视器,多个线程共同使用唯一的同步监视器
Object obj=new Object();
//重写run方法
@Override
public void run() {
while (true) {
synchronized (obj) {
if (ticket>0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() +"开始售票,票号为"+ ticket);
ticket--;
}else {
break;
}
} }
}
}
package threadtest;
//同步代码块实现继承Thread的线程
public class ThreadTest { public static void main(String[] args) {
//创建子类对象
EvenThread e1=new EvenThread();
EvenThread e2=new EvenThread();
EvenThread e3=new EvenThread();
//调用线程的start()启动
e1.setName("票口一");
e2.setName("票口二");
e3.setName("票口三"); e1.start();
e2.start();
e3.start();
} } //创建一个类继承与Thread类
class EvenThread extends Thread{
static int ticket=100;
//定义同步监视器,多个线程共同使用唯一的同步监视器
static Object obj=new Object();
//重写run方法
@Override
public void run() {
while (true) {
//synchronized (obj) {//方式一,确保同步监视器唯一
synchronized (EvenThread.class) {//EvenThread.class是唯一的
if (ticket>0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() +"开始售票,票号为"+ ticket);
ticket--;
}else {
break;
}
} }
}
}
说明:共享数据------多个线程共同操作的数据
需要被同步的代码块,纪委操作共享的代码
同步监视器,俗称锁,任何一个类都可以充当同步监视器,但是,要求多个线程共用一个监视器
- 方式二:同步方法:如果操作共享数据的代码,完整的声明在相依的方法中,着我们可以考虑将此方法作为同步方法来写
- 非静态的同步方法的默认监视器是this,不能修改
- 静态的同步方法的监视器是当前类本身,不能修改
package threadtest;
//创建同步方法实现Runable的线程
public class Ruanble { public static void main(String[] args) {
//创建实现类的对象
Num num=new Num();
//将此对象作为参数传递给Thread类的构造器,创建Thread类的对象
Thread thread1 =new Thread(num);
Thread thread2 =new Thread(num);
Thread thread3 =new Thread(num);
//调用start()启动创建的Thread对象 thread1.setName("线程一");
thread2.setName("线程二");
thread3.setName("线程三"); thread1.start();
thread2.start();
thread3.start();
}
}
//创建一个类实现Runable接口
class Num implements Runnable{
int ticket=100;
//定义同步监视器,多个线程共同使用唯一的同步监视器
Object obj=new Object();
//重写run方法
@Override
public void run() {
while (true) {
push();
}
}
//同步方法
public synchronized void push() {//这里有默认的同步监视器this,是唯一的
if (ticket>0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() +"开始售票,票号为"+ ticket);
ticket--;
}
}
}
//使用同步方法的来写继承Thread类的
package threadtest; public class ThreadTest { public static void main(String[] args) {
//创建子类对象
EvenThread e1=new EvenThread();
EvenThread e2=new EvenThread();
EvenThread e3=new EvenThread();
//调用线程的start()启动
e1.setName("票口一");
e2.setName("票口二");
e3.setName("票口三"); e1.start();
e2.start();
e3.start();
} } //创建一个类继承与Thread类
class EvenThread extends Thread{
static int ticket=100;
//定义同步监视器,多个线程共同使用唯一的同步监视器
static Object obj=new Object();
//重写run方法
@Override
public void run() {
while (true) {
push();
}
}
//public synchronized void push() {//此时不加static,会在new EvenThred对象是,导致同步监视器不是唯一的,故加上static,让它先于类的创建而创建
public synchronized static void push(){
if (ticket>0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() +"开始售票,票号为"+ ticket);
ticket--;
}
}
}
方式三使用lock锁来确保安全,见下篇博客:链接---->
https://www.cnblogs.com/ylblikestudyJava/p/12378013.html
java如何解决线程安全问题的更多相关文章
- Java之解决线程安全问题的方式三:Lock锁
import java.util.concurrent.locks.ReentrantLock; /** * 解决线程安全问题的方式三:Lock锁 --- JDK5.0新增 * * 1. 面试题:sy ...
- java 22 - 12 多线程之解决线程安全问题的实现方式1
从上一章知道了多线程存在着线程安全问题,那么,如何解决线程安全问题呢? 导致出现问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 上一章的程序,上面那3条都具备, ...
- java线程安全问题以及使用synchronized解决线程安全问题的几种方式
一.线程安全问题 1.产生原因 我们使用java多线程的时候,最让我们头疼的莫过于多线程引起的线程安全问题,那么线程安全问题到底是如何产生的呢?究其本质,是因为多条线程操作同一数据的过程中,破坏了数据 ...
- 浅谈利用同步机制解决Java中的线程安全问题
我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等 ...
- java并发之如何解决线程安全问题
并发(concurrency)一个并不陌生的词,简单来说,就是cpu在同一时刻执行多个任务. 而Java并发则由多线程实现的. 在jvm的世界里,线程就像不相干的平行空间,串行在虚拟机中.(当然这是比 ...
- java 22 - 13 多线程之解决线程安全问题的实现方式2
上一章说了,解决线程安全问题的实现方式1是使用同步代码块 同时也知道了,同步代码块的锁对象是任意对象:(Object obj ; Demo d;)这些都行 那么,现在来说解决线程安全问题的实现方式2 ...
- Lock锁方式解决线程安全问题
在JDK5.0之后新增加了一种更强大的线程同步机制---通过显示定义同步锁来实现线程同步解决线程安全问题.同步锁使用Lock对象充当. java.util.concurrent.locks.lock接 ...
- 逐步理解Java中的线程安全问题
什么是Java的线程安全问题? 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读/写完,其他线程才可使用.不会出现数据不一致或者数据 ...
- java并发之线程安全问题
并发(concurrency)一个并不陌生的词,简单来说,就是cpu在同一时刻执行多个任务. 而Java并发则由多线程实现的. 在jvm的世界里,线程就像不相干的平行空间,串行在虚拟机中.(当然这是比 ...
随机推荐
- 《即时消息技术剖析与实战》学习笔记10——IM系统如何应对高并发
一.IM 系统的高并发场景 IM 系统中,高并发多见于直播互动场景.比如直播间,在直播过程中,观众会给主播打赏.送礼.发送弹幕等,尤其是明星直播间,几十万.上百万人的规模一点也不稀奇.近期随着武汉新型 ...
- Shell与进程
查看当前运行的进程 名称: ps 使用权限: 所有使用者 使用方式: ps [options] [--help] 说明: 显示瞬间行程 (process) 的动态 参数: ps的参数非常多, 在此仅列 ...
- 转载---class文件中的字段表集合--field字段在class文件中是怎样组织的
写的太好了! https://blog.51cto.com/1459294/1932331
- python 动态导包
python 包简介 基本导包/模块 import 动态导包/模块 __import__ importlib 1. python 包简介 包是一个分层次的文件目录结构,它定义了一个由模块及子包,和 ...
- HTML简介介绍
网页概述 网页:纯文本格式的文件:(以村文本格式编写,后缀名改为HTML的文本文件) ---- 网站:多个网页的集合: ---- 主页:打开网站后显示的第一个页面: ---- 浏览器:将纯文本格式的文 ...
- WPF另类实现摄像头录像
WPF中使用第三方控件来直接进行录像的控件没有找到(aforgenet好像不维护了?WPFMediaKit好像只能实现摄像头拍照.收费的控件没有使用,不做评论.) 通过百度(感谢:https://ww ...
- win10下Java12环境变量设置
jdk下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html 变量设置: 右键"我的电脑" ...
- sublime: javascript/css 的格式化
Sublime Text 3 破解版 + 注册机 + 汉化包 + 教程 http://www.xiumu.org/note/sublime-text-3.shtml 1.sublime 如果控制菜单选 ...
- Codeforces_460_B
http://codeforces.com/problemset/problem/460/B 枚举s(X). #include<cstdio> #include<iostream&g ...
- 微信小程序—Flex布局
参考教程:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html https://xluos.github.io/demo/flexb ...