我是靠谱客的博主 现实老师,最近开发中收集的这篇文章主要介绍(47)Java学习笔记——多线程 / 线程的安全问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

线程安全问题

产生的原因:

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();
	}
}
——————————————————————————

死锁

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





最后

以上就是现实老师为你收集整理的(47)Java学习笔记——多线程 / 线程的安全问题的全部内容,希望文章能够帮你解决(47)Java学习笔记——多线程 / 线程的安全问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部