概述
线程安全问题
产生的原因:
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学习笔记——多线程 / 线程的安全问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复