(47)Java学习笔记——多线程 / 线程的安全问题

原创 2017年02月18日 15:36:57

线程安全问题

产生的原因:

A / 是否是多线程环境

B / 是否有共享数据

C / 是否有多条语句操作共享数据

解决线程安全问题实现一:

同步代码块

思想:

把多条语句操作共享数据的代码包成一个整体,在某个线程操作的时候其他线程不能执行。

——线程同步

格式:

synchronized(对象){需要同步的代码}

对象:同步解决安全问题的根本原因就在对象!该对象如同锁的功能!

            多个线程必须是同一把锁!

需要被同步代码:把多条语句操作共享数据的代码的部分包起来。

范例:电影院有100张票,3个窗口,同时卖票

package cn.itcast_01;

public class Sell implements Runnable {
	//为让多个对象共享100张票,需要静态修饰
	private static int tickets = 100;
	//创建同步锁对象
	private Object obj =new Object();
	@Override
	public void run() {
		while (true){
			synchronized(obj){		//同步代码块  //对象就是锁
				if(tickets>0){
					System.out.println(Thread.currentThread().getName()+"---"+(tickets--));
				}
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

}
package cn.itcast_01;
/*
 * 卖票
 */
public class ThreadSellDemo {
	public static void main(String[] args) {
		//创建Sell类对象
		Sell sell = new Sell();
		
		//创建Thread线程对象
		Thread td1 = new Thread(sell,"窗口一:");
		Thread td2 = new Thread(sell,"窗口二:");
		Thread td3 = new Thread(sell,"窗口三: ");
		
		td1.start();
		td2.start();
		td3.start();
	}
}

同步代码块的特点及好处和弊端

同步的前提:

A / 多线程

B / 多个线程使用的是同一个锁对象

同步的好处

同步的出现解决了多线程的安全问题

同步的弊端:

当线程很多的时候,每一个线程都会去判断同步上的锁,耗费资源,降低程序的运行效率。

同步代码块的锁及同步方法应用和锁的问题:

同步代码块的锁对象:任意对象。

————————————————————

同步方法

格式:

把同步关键字加在方法上。

同步方法的锁:this 


静态方法及锁对象的问题:

静态方法的锁:类的字节码文件对象(类的Class)


————————————————————————————————————————

解决线程安全问题实现二:

Lock  接口

方法:

void lock()     //获取锁

void unlock()     //释放锁

Lock的实现类:

ReenreanLock

范例

package cn.itcast_01;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Sell implements Runnable {
	//为让多个对象共享100张票,需要静态修饰
	private static int tickets = 100;
	//创建Lock锁对象
	private Lock lock = new ReentrantLock();   
	@Override
	public void run() {
		while (true){
			try{	//try...finally 异常处理
			//加锁:
			lock.lock();  
				if(tickets>0){
					System.out.println(Thread.currentThread().getName()+"---"+(tickets--));
				}
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
			}
		}finally{
			//释放锁
			lock.unlock();
		}
	}
	}
}
package cn.itcast_01;
/*
 * 卖票
 */
public class ThreadSellDemo {
	public static void main(String[] args) {
		//创建Sell类对象
		Sell sell = new Sell();
		
		//创建Thread线程对象
		Thread td1 = new Thread(sell,"窗口一:");
		Thread td2 = new Thread(sell,"窗口二:");
		Thread td3 = new Thread(sell,"窗口三: ");
		
		td1.start();
		td2.start();
		td3.start();
	}
}
——————————————————————————

死锁

如果出现同步嵌套,就容易产生死锁问题。





版权声明:本文为博主原创文章,未经博主允许不得转载。

Java多线程安全问题及解决方案

Java多线程安全问题及解决方案 一、问题引入 通过最常见的多窗口售票问题引入线程安全的问题。代码如下: 注:这里使用Runnable接口来实现线程,这样做是为了共享代售票这个资源,如果我们使用继承T...
  • OONullPointerAlex
  • OONullPointerAlex
  • 2016年03月16日 22:17
  • 1534

多线程_线程安全问题的产生原因分析

package cn.itcast_09; /* * 如何解决线程安全问题呢? * * 要想解决问题,就要知道哪些原因会导致出问题:(而且这些原因也是以后我们判断一个程序是否有线程安全问题的...
  • L1585931143
  • L1585931143
  • 2017年03月12日 20:06
  • 616

JAVA多线程不安全问题解决方案(多线程并发同一资源)。

引例:吃苹果比赛,3个人同时吃50个苹果,谁先拿到谁就吃,每个哦ing过都有编号。 问题: 多线程同时执行的时候可能出现不安全问题 当3个人同时拿到一个苹果,他们的编号就一样,当时主要看是谁先吃掉苹果...
  • blank__box
  • blank__box
  • 2017年04月24日 10:28
  • 1237

java多线程(6)--多线程的安全问题总结

1、多线程安全问题分析   多线程安全问题原因是在cpu执行多线程时,在执行的过程中可能随时切换到其他的线程上执行。      在以上红色选中的三个部分,线程都有可能进行切换。只要cpu在这个三个地中...
  • helongzhong
  • helongzhong
  • 2017年02月08日 22:41
  • 407

java多线程学习笔记(一)!更好的理解多线程

1.线程的创建 之前知道java中一个多线程的创建方法是继承Thread类或者实现Runable接口,但是看不懂下面这种创建线程的方法 第一种 new Thread(new Runnable()...
  • a347911
  • a347911
  • 2016年11月15日 09:56
  • 453

什么情况下会有线程安全问题

Q:什么情况下会有线程安全问题 A:当某个实现多线程的线程类中有实例变量时 ps:有状态,无状态对象是什么概念 有状态就是有数据存储功能。有状态对象(Stateful Bean)...
  • feicongcong
  • feicongcong
  • 2017年08月21日 01:12
  • 833

Java多线程之迭代器问题(四)

1.迭代器的问题无论是直接迭代还是for-each循环(for-each内部也是用迭代器实现)语句,对容器迭代的标准方式都是Iterator。但是,即使是使用迭代器,也无法避免在迭代器在迭代期间对容器...
  • qq_33394088
  • qq_33394088
  • 2017年12月04日 12:28
  • 415

Java多线程之i++的安全性问题

问题: 两个线程同时对i=0的数据分别进行i++一百次,结果出来并不是200。理论上来讲,结果最小值为2,最大值为200。 首先解释一下为什么会这样。 i++并非原子操作。执行过程中JVM从内存...
  • zrh_lawliet
  • zrh_lawliet
  • 2016年12月09日 21:22
  • 1998

遍历list的线程安全问题

在讲如何线程安全地遍历List之前,先看看通常我们遍历一个List会采用哪些方式。 方式一: for(int i = 0; i ) { System.out.println(list.ge...
  • asdfsadfasdfsa
  • asdfsadfasdfsa
  • 2017年06月15日 17:03
  • 1204

java 中如何避免多线程不安全

在java应用中,我们时常要用到java中的多线程。如何实现一个正确的多线程。本文提供了指导。...
  • ai_xiangjuan
  • ai_xiangjuan
  • 2017年07月09日 21:23
  • 293
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(47)Java学习笔记——多线程 / 线程的安全问题
举报原因:
原因补充:

(最多只允许输入30个字)