您的位置:首页 > 编程语言 > Java开发

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

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

如果出现同步嵌套,就容易产生死锁问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐