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

死锁

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





阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiexiecm/article/details/55667802
个人分类: Java
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭