(47)Java学习笔记——多线程 / 线程的安全问题
2017-02-18 15:36
816 查看
线程安全问题
产生的原因:
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();
}
}
}
}
}
同步代码块的特点及好处和弊端
同步的前提:
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();
}
}
}
}
死锁
如果出现同步嵌套,就容易产生死锁问题。
产生的原因:
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笔记3 多线程<1>线程概述、多线程的创建、多线程的安全问题、静态同步函数的锁、死锁
- Java 学习笔记16:用ThreadLocal解决多线程安全问题
- Java学习笔记45(多线程二:安全问题以及解决原理)
- java 多线程学习之多生产者多消费者产生的线程安全问题分析与解决:Lock和Condition
- 学习笔记之Java线程安全杂谈(中)——Java内存模型、happens-before原则和DCL问题
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
- 黑马程序员—10—java基础:有关多线程安全的学习笔记和学习心得体会
- java线程安全问题笔记
- Java多线程学习笔记——从Java JVM对多线程数据同步的一些理解
- java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)
- [学习笔记]Java多线程经典问题
- java基础知识回顾之java Thread类学习(四)--java多线程安全问题(锁)
- 《黑马程序员》java笔记->多线程安全问题
- 学习笔记:java线程安全
- java 多线程(线程间通信-解决安全问题)
- 静态变量、实例变量、局部变量在多线程环境下的线程安全问题 java 多线程
- [原]Java多线程编程学习笔记之一:线程中断(含代码)
- java 学习-----多线程的安全问题
- Java学习笔记26:webx安全配置问题