多线程共享数据:
在多线程的操作中,多个线程有可能同时处理一个资源,即为多线程中的共享数据。
线程同步:
解决线程共享问题,必须使用同步,所谓同步就是指多个线程在同一个时间段内只能有一个线程执行指定代码块,其它线程需要等待此线程执行完成之后才可以继续执行。
以下各线程同步方法实例代码运行效果图如下所示:
synchronized线程同步使用方法:
1.同步代码块:
synchronized(要同步的对象){
要同步的操作;
}
/**
* 模拟售票
*/
public class ThreadDemo01 {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
//创建线程
Thread t1 = new Thread(myRunnable);
Thread t2 = new Thread(myRunnable);
//运行线程
t1.start();
t2.start();
}
}
class MyRunnable implements Runnable{
//售票数
private int ticket = 10;
private Object obj = new Object();
@Override
public void run() {
for (int i = 1; i <= ticket * 10; i++){
//同步代码块
synchronized (obj){
if (ticket > 0){
ticket--;
try{
//休眠1秒
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("您购买的票剩余:"+ticket+"张");
}
}
}
}
}
2.同步方法:
public synchronized void method(){
要同步的操作;
}
/**
* 模拟售票
*/
public class ThreadDemo01 {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
//创建线程
Thread t1 = new Thread(myRunnable);
Thread t2 = new Thread(myRunnable);
//运行线程
t1.start();
t2.start();
}
}
class MyRunnable implements Runnable{
//售票数
private int ticket = 10;
private Object obj = new Object();
@Override
public void run() {
for (int i = 1; i <= ticket * 10; i++){
//调用同步方法
method();
}
}
//同步方法
public synchronized void method(){
if (ticket > 0){
ticket--;
try{
//休眠1秒
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("您购买的票剩余:"+ticket+"张");
}
}
}
3.Lock(ReentrantLock)关锁开锁方法:
先创建锁对象(ReentrantLock):
ReentrantLock lock = new ReentrantLock();
后选择是在代码块中使用还是方法中使用都可以,方法如下:
lock.lock();//关锁
要同步的操作;
lock.unlock();//开锁
import java.util.concurrent.locks.ReentrantLock;
/**
* 模拟售票
*/
public class ThreadDemo01 {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
//创建线程
Thread t1 = new Thread(myRunnable);
Thread t2 = new Thread(myRunnable);
//运行线程
t1.start();
t2.start();
}
}
class MyRunnable implements Runnable{
//售票数
private int ticket = 10;
private Object obj = new Object();
@Override
public void run() {
for (int i = 1; i <= ticket * 10; i++){
//调用同步方法
method();
}
}
//创建锁对象
ReentrantLock lock = new ReentrantLock();
//同步方法
public void method(){
lock.lock();//关锁
if (ticket > 0){
ticket--;
try{
//休眠1秒
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("您购买的票剩余:"+ticket+"张");
}
lock.unlock();//开锁
}
}