Java——多线程安全问题
/*
* 线程安全问题产生的原因:
* 1.多个线程操作共享的数据
* 2.操作共享数据的线程代码有多条
*
* 当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了云轩。就会导致线程安全问题的产生。
* 解决思路:
* 就是将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候,其他线程不可以参与运算的。
* 必须要当前线程把这些代码都执行完成后,其他线程才可以参与运算。
*
* 在java中,用同步代码块就可以解决这个问题。
同步函数使用的锁是this
* 同步代码块的格式:
* synchronized(对象)
* {
*
需要被同步的 代码块;
* }
同步的好处:解决了线程的安全问题。
* 同步的弊端:相对降低了效率,因为同步外的线程都会判断同步锁。
同步函数使用的锁是this;
同步函数和同步代码块的区别:
同步函数的锁是固有的的this。
同步代码块的锁是任意的对象。
建议使用 同步代码块。
*/
class TicketTest implements Runnable
{
private int num = 100;
private Object obj = new Object();
@Override
public void run()
{
// TODO Auto-generated method stub
while(true)
{
synchronized(obj)
{
if(num>0)
{
System.out.println(Thread.currentThread().getName()+"------------"+num--);
}
else
break;
}
}
}
}
public class Ticket
{
public static void main(String[] args)
{
//创建一个线程任务对象
TicketTest t = new TicketTest();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
l
/*
* 建立一个线程任务:
* 目的是 向银行 每次存款 100, 存3次
同步函数使用的锁是this
*/
class Bkk implements Runnable
{
private Bank b = new Bank();
@Override
public void run()
{
// TODO Auto-generated method stub
for(int i=0; i<3; i++)
{
b.add(100);
}
}
}
class Bank
{
private int sum;
同步函数使用的锁是this
public synchronized void add(int num)//同步函数********************
{
sum += num;
System.out.println(sum);
}
}
public class LockTest
{
public static void main(String[] args)
{
// TODO Auto-generated method stub
RenWu a = new RenWu(true);
RenWu b = new RenWu(false);
Thread t1 = new Thread(a);
Thread t2 = new Thread(b);
t1.start();
t2.start();
}
}
//任务对象
class RenWu implements Runnable
{
private Boolean flag;//设定俩中情况
RenWu(Boolean flag)
{
this.flag = flag;
}
@Override
public void run()
{
// TODO Auto-generated method stub
if(flag)//让第一种情况去用第一把锁
{
synchronized (MyLock.Locka)
{
System.out.println(Thread.currentThread().getName()+".........."+ MyLock.Locka);
synchronized (MyLock.Lockb)//然后想用另外一把锁 这时发现 另外这把锁 有可能就被 另一个任务线程使用着
{
System.out.println(Thread.currentThread().getName()+".........."+ MyLock.Lockb);
}
}
}
else//让第二种情况去使用 第二把锁
{
synchronized (MyLock.Lockb)
{
System.out.println(Thread.currentThread().getName()+".........."+ MyLock.Lockb);
synchronized (MyLock.Locka)//然后想用另外一把锁 这时发现 另外这把锁 有可能就被 另一个任务线程使用着
{
System.out.println(Thread.currentThread().getName()+".........."+ MyLock.Locka);
}
}
}
}
}
//只有俩把锁 主要有其中一把锁 被锁上了 另外想用这吧锁的 这能等正在用的这把锁被打开后 才能使用
class MyLock
{
final static Object Locka = new Object();
final static Object Lockb = new Object();
}
l
版权声明:本文为博主原创文章,未经博主允许不得转载。
Java——多线程安全问题的更多相关文章
- Java 多线程安全问题简单切入详细解析
线程安全 假如Java程序中有多个线程在同时运行,而这些线程可能会同时运行一部分的代码.如果说该Java程序每次运行的结果和单线程的运行结果是一样的,并且其他的变量值也都是和预期的结果是一样的,那么就 ...
- java基础知识回顾之java Thread类学习(四)--java多线程安全问题(锁)
上一节售票系统中我们发现,打印出了错票,0,-1,出现了多线程安全问题.我们分析为什么会发生多线程安全问题? 看下面线程的主要代码: @Override public void run() { // ...
- 【JAVA多线程安全问题解析】
一.问题的提出 以买票系统为例: class Ticket implements Runnable { public int sum=10; public void run() { while(tru ...
- java 多线程安全问题-同步代码块
/* 多线程的安全问题: while(true) { if(tick>0) { //线程0,1,2,3在余票为1时,都停滞在这里,之后分别获得CPU执行权,打印出0,-1,-2等错票 Syste ...
- java多线程安全问题-同步修饰符于函数
上一篇文章通过卖票使用同步代码块的方法解决安全问题本篇文章首先探讨如何找出这样的安全问题,并提出第二种方式(非静态函数synchronized修饰)解决安全问题 /* 需求: 银行有一个公共账号金库 ...
- Java多线程安全问题
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提
这里举个例子讲解,同步synchronized在什么地方加,以及同步的前提: * 1.必须要有两个以上的线程,才需要同步. * 2.必须是多个线程使用同一个锁. * 3.必须保证同步中只能有一个线程在 ...
- java 多线程安全问题的解决方法
三种方法: 同步代码块: synchronized(obj) { //obj表示同步监视器,是同一个同步对象 /**..... TODO SOMETHING */ } 同步方法 格式: 在方法上加 ...
- java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)
死锁:是两个或者两个以上的线程被无限的阻塞,线程之间互相等待所需资源. 线程死锁产生的条件: 当两个线程相互调用Join()方法. 当两个线程使用嵌套的同步代码块的时候,一个线程占用了另一个线程的锁, ...
随机推荐
- iOS多线程之GCD学习笔记
什么是GCD 1.全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 2.纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 G ...
- YAML 语言语法
发现很多开源的软件的配置文件都使用了这种语言来描述,据说是简单强大,很不巧,ansible也使用了这种语言来描述配置,学习ansible之前,先学习一下YAML语言. YAML基本语法规则如下: 大小 ...
- <转>用thinkPHP实现验证码的功能
许多系统的登录都有验证码,而如果使用thinkPHP框架搭建网站的话,验证码的生成和验证就比较容易了 1.生成验证码 thinkPHP有对应生成验证码的方法 要使用验证码,需要导入扩展类库中的ORG. ...
- poj1181 大数分解
//Accepted 164 KB 422 ms //类似poj2429 大数分解 #include <cstdio> #include <cstring> #include ...
- 云计算平台简介(App Engine)
云计算平台简介(App Engine) 1 简介 App Engine: 应用程序引擎,是托管网络应用程序的云计算平台. 1.1 什么是云 云计算通常简称为“云”,是一种通过 Inter ...
- Java三大主流开源工作流引擎技术分析
首先,这个评论是我从网上,书中,搜索和整理出来的,也许有技术点上的错误点,也许理解没那么深入.但是我是秉着学习的态度加以评论,学习,希望对大家有用,进入正题! 三大主流工作流引擎:Shark,oswo ...
- 深入分析:Fragment与Activity交互的几种方式(一,使用Handler)
这里我不再详细介绍那写比较常规的方式,例如静态变量,静态方法,持久化,application全局变量,收发广播等等. 首先我们来介绍使用Handler来实现Fragment与Activity 的交互. ...
- PHP文件系统处理(二)
1.文件的打开和关闭(读文件中的内容,向文件中写内容) 读取文件中的内容 file_get_contents() //php5以上 < ...
- HDOJ-三部曲一(搜索、数学)-1003-Curling 2.0
Curling 2.0 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total ...
- 【LeetCode OJ】Linked List Cycle
Problem link: http://oj.leetcode.com/problems/linked-list-cycle/ We set two pointers: the faster poi ...