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()方法. 当两个线程使用嵌套的同步代码块的时候,一个线程占用了另一个线程的锁, ...
随机推荐
- 由于lightdm.conf 错误无法进入ubuntu 的办法
由于自己向默认登录GNOME桌面,所以修改了lightdm,由于参数错误,结果无法启动桌面? 这是需要进入shell界面: 1.选择cancel ,如果虚拟机下无法点击cancel按钮,可以使用快捷键 ...
- iOS 引导页组件 HcdGuideView
HcdGuideView HcdGuideView让你为你的app添加一个漂亮的启动页变得简单. 要求 Xcode 6 or higher iOS 7.0 or higher ARC 安装方法 手动安 ...
- Oracle GoldenGate 12c实时捕获SQL Server数据
在Oracle GoldenGate 12c中,对一些最新的数据库提供了支持,比如SQL Server 2012/2014,当然12c也支持sql server 2008.主要新增特性有: 捕获进程可 ...
- ODI中web service介绍
ODI WS架构
- poj3667 线段树 区间合并
//Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...
- Objective-C中NSValue的使用
我们在C/C++开发中常会用到结构体来帮助我们简单封装基本数据类型,在Objective-C中我们也可以使用结构体来完成数据类型的封装.同时,Cocoa Touch还提供了一个NSValue来帮助我们 ...
- TPLink 备份文件bin文件解析
TPLink 路由器备份文件bin文件 测试路由器 WR885,备份文件加密方式DES,密钥:478DA50BF9E3D2CF linux端: openssl enc -d -des-ecb -nop ...
- MATLAB里的正则表达式 [转]
正则表达式在处理字符串及文本时显得十分方便,在perl, python等脚本语言,以及java, .net等平台上都支援正则表达式.事实上,在MATLAB中也提供了正则表达式的支持.主要包含三个常用的 ...
- 极客DIY:打造属于自己的无线移动渗透测试箱
本文中介绍的工具.技术带有一定的攻击性,请合理合法使用. 你想不想拥有一款属于自己的移动无线渗透测试箱,如果你感兴趣,下面介绍的设备将会对你很有帮助.这个箱子被称为“MiTM(中间人攻击)WiFi箱” ...
- Linux学习之CentOS--FTP服务原理及vsfptd的安装、配置
本篇随笔将讲解FTP服务的原理以及vsfptd这个最常用的FTP服务程序的安装与配置... 一.FTP服务原理 FTP(File Transfer Protocol)是一个非常古老并且应用十分广泛的文 ...