------- android培训java培训、期待与您交流!
----------

导致多线程出现问题的一个特殊的状态:就绪。具备了执行资格,但是还没有获取资源。

导致安全问题的出现的原因:

1. 多个线程访问出现延迟。

    2.线程随机性。

同步代码块:

Java对于多线程的安全问题提供了专业的解决方式。就是同步代码块。

同步代码块格式:

synchronized(对象)

      {

             需要被同步的代码

      }

对象如同锁。持有锁的线程可以在同步中执行。没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。

同步的前提:

1、必须要有两个或者两个以上的线程。

       2、必须是多个线程使用同一个锁。

必须保证同步中只能有一个线程在运行。

同步代码块的优缺点:

好处:解决了多线程的安全问题。

弊端:多个线程需要判断锁,较为消耗资源,

还是经典的卖票程序,经过安全处理后:

/**
*
* 解决卖票程序的安全问题
* 同步代码块 synchronized
*
*/
public class SynchronizedDemo
{
public static void main(String[] args)
{
Tic t = new Tic(); 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();
}
} class Tic implements Runnable
{
private int tic = 100;
Object obj = new Object(); public void run()
{
while (tic>0)
{
synchronized(obj)
{
//为了效果明显这里用了sleep方法,此方法需要指定睡眠时间,单位毫秒,应用需要try{}catch{}
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"--------"+tic--);
}
}
}

如何找问题:

     1,明确哪些代码是多线程运行代码。

     2,明确共享数据。

     3,明确多线程运行代码中哪些语句是操作共享数据的。

同步函数特点:

如果参数没有就默认是this.

如果被静态修饰就是XX.class。因为静态没有this 

/**
* 需求:
* 银行有一个金库。
* 有两个储户分别存300员,每次存100,存3次。
*/
class Bank
{
private int sum;
//下面调用用了多线程,所以这里需要同步
public synchronized void add(int num)//同步函数
{
sum += num;
System.out.println("sum = "+sum);
}
} class Cus implements Runnable
{
//这里只能创建一个银行,所以放在run外面
private Bank b = new Bank(); public void run()
{
for (int i=0;i<3 ;i++ )
{
b.add(100);
}
}
} class BankDemo
{
public static void main(String[] args)
{
Cus c = new Cus(); Thread c1 = new Thread(c);
Thread c2 = new Thread(c); c1.start();
c2.start();
}
}

在多线程里面会发生一种叫做死锁的情况,应尽量避免死锁的发生。

死锁:是指多个进程因竞争系统资源或相互通信而造成的一种僵局

死锁产生的原因:

1.竞争资源:多个进程竞争资源,而资源又不能同时满足其需求

2.进程推进顺序不当:进程申请资源和释放资源的顺序不当

注意:

1.死锁是因资源竞争造成的僵局

2.死锁至少涉及两个进程

3.死锁与部分进程及资源相关

解决死的基本方法:

1.预防死锁:设置某些限制条件,通过破坏死锁产生的条件来预防死锁

2.避免死锁:在资源的动态分配过程中,用某种方法来防止系统进入不安全状态

3.检测死锁及解除死锁:系统定期检测是否出现死锁,若出现则解除死锁

/**
*
* 死锁程序的演示
* 尽量避免!!!
*
*/
public class MyLock
{
public static void main(String[] args)
{
Thread t1 = new Thread(new Test(true));
Thread t2 = new Thread(new Test(false)); t1.start();
t2.start();
}
} //声明一个类,里面创建两个对象,代表两个锁
class Lock
{
static Object locka = new Object();//静态只能访问静态
static Object lockb = new Object();
} //声明一个类,实现Runnable接口,演示死锁的多线程类
class Test implements Runnable
{
private boolean flag;
Test (boolean flag)
{
this.flag = flag;
} public void run()
{
if (flag)
{
while(true)
{
synchronized (Lock.locka)
{
System.out.println(Thread.currentThread().getName()+"------"+"if locka");
synchronized (Lock.lockb)
{
System.out.println(Thread.currentThread().getName()+"------"+"if lockb");
}
}
}
}
else
{
while (true)
{
synchronized (Lock.lockb)
{
System.out.println(Thread.currentThread().getName()+"------"+"else lockb");
synchronized (Lock.locka)
{
System.out.println(Thread.currentThread().getName()+"------"+"else locka");
}
}
}
}
}
}

------- android培训java培训、期待与您交流!
----------

黑马程序员——JAVA基础之多线程的安全问题的更多相关文章

  1. 黑马程序员 Java基础<九>---> 多线程

    ASP.Net+Android+IOS开发..Net培训.期待与您交流! 多线程 一.概述: 1.线程是什么 说到线程,我们就得先说说进程.所谓进程,就是一个正在执行(进行)中的程序,每一个进程执行都 ...

  2. 黑马程序员----java基础:多线程

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ---- ...

  3. 黑马程序员——JAVA基础之多线程的线程间通讯等

    ------- android培训.java培训.期待与您交流! ---------- 线程间通讯: 其实就是多个线程在操作同一个资源,但是动作不同. wait(); 在其他线程调用此对象的notif ...

  4. 黑马程序员----java基础笔记中(毕向东)

    <p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...

  5. 黑马程序员Java基础班+就业班课程笔记全发布(持续更新)

    正在黑马学习,整理了一些课程知识点和比较重要的内容分享给大家,也是给自己拓宽一些视野,仅供大家交流学习,大家有什么更好的内容可以发给我 ,现有黑马教程2000G  QQ 1481135711 这是我总 ...

  6. 黑马程序员----java基础笔记上(毕向东)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 笔记一共记录了毕向东的java基础的25天课程,分上.中.下 本片为上篇,涵盖前10天课程 1. ...

  7. 黑马程序员——JAVA基础之泛型和通配符

    ------- android培训.java培训.期待与您交流! ---------- 泛型:            JDK1.5版本以后出现新特性.用于解决安全问题,是一个类型安全机制. 泛型好处: ...

  8. 黑马程序员——JAVA基础之简述面向对象,类,变量,匿名对象

    ------- android培训.java培训.期待与您交流! ---------- 面向对象: 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 强调的是功能行为 面向对象 将 ...

  9. 黑马程序员——JAVA基础之语法、命名规则

    ------- android培训.java培训.期待与您交流! ---------- 1.java语言组成:关键字,标识符,注释,常量和变量,运算符,语句,函数,数组. 2.java关键字:被Jav ...

随机推荐

  1. OpenCV之响应鼠标(四):在图像上绘制出矩形并标出起点的坐标

    涉及到两方面的内容:1. 用鼠标画出矩形.2.在图像上绘制出点的坐标 用鼠标绘制矩形,涉及到鼠标的操作,opencv中有鼠标事件的介绍.需要用到两个函数:回调函数CvMouseCallback和注册回 ...

  2. Hadoop c++开发

    假设你有上百G的数据,你要统计出这些数据中,含有某些你感兴趣的内容的数据的有多少条,你会怎么做?在硬件条件允许的情况下,用hadoop并行计算是一个不错的选择. 为了使本文得以清晰地说明,我们不妨假设 ...

  3. 《JAVA笔记 day08 静态_单例》

    //static关键字: /* 静态方法的使用注意事项: 1,静态方法不能访问非静态的成员. 但是非静态是可以访问静态成员的. 说明:静态的弊端在于访问出现了局限性.好处是可以直接别类名调用. 2,静 ...

  4. unity3d基础01

    Unity3d 五大视图: 1 Scene:存放hierarchy中创建的游戏对象,但实际只能看到一部分 *Scene浏览: ①右键进入“飞行模式”,方便查看整个场景 ②选中摄像机,按ALT进入浏览的 ...

  5. (转)SQLLite数据操作

    原文:http://dreamboy.blog.51cto.com/3180937/722352 SQLLite数据操作 一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存 ...

  6. MouseJack:利用15美元的工具和15行代码控制无线鼠标和键盘

    Bastille的研究团队发现了一种针对蓝牙键盘鼠标的攻击,攻击者可以利用漏洞控制你的电脑操作.研究团队将此攻击命名为MouseJack. 七大厂商皆中招 软件工程师马克纽林说:“利用假冒的无线电脑鼠 ...

  7. python3爬虫再探之EXCEL

    在爬取数据之后,数据的保存就成为一个新的问题,一般不太大的的数据存储到EXCEL就可以了.这里介绍一个python的第三方库——xlsxwriter. 这个库的安装就不介绍了,pip就可以,不用FQ. ...

  8. Linux怎么使用添加的新硬盘

    一.磁盘分区 装过系统后第一块磁盘的设备号是/dev/sda,在你添加一个新的磁盘后一般情况下是/dev/sdb *******进入fdisk界面***** # fdisk /dev/sdbDevic ...

  9. PDOStatement::bindParam的一个陷阱

    废话不多说, 直接看代码: <?php $dbh = new PDO('mysql:host=localhost;dbname=test', "test"); $query ...

  10. 转:UniqueID和ClientID的来源

    转:http://www.cnblogs.com/GrayZhang/archive/2009/03/05/how-uniqueid-is-generated.html 在<漫话ID>一文 ...