软件编程
位置:首页>> 软件编程>> java编程>> Java多线程下解决数据安全问题

Java多线程下解决数据安全问题

作者:季沐  发布时间:2022-05-16 04:48:45 

标签:Java,多线程,安全

同步代码块

基本语句

synchronized (任意对象) {

操作共享代码

}

代码示例


public class SellTicket implements Runnable {
   private int tickets = 100;
   private Object object = new Object();
   @Override
   public void run() {
       while (true) {
           synchronized (object) {
               if (tickets > 0) {
                   try {
                       Thread.sleep(100);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
                   tickets--;
               }
           }
       }
   }
   public static void main(String[] args) {
       SellTicket sellTicket = new SellTicket();
       Thread thread1 = new Thread(sellTicket, "窗口1");
       Thread thread2 = new Thread(sellTicket, "窗口2");
       Thread thread3 = new Thread(sellTicket, "窗口3");
       thread1.start();
       thread2.start();
       thread3.start();
   }
}

优缺点:

  • 解决了多线程的数据安全问题

  • 多线程时,每个线程都会判断同步上的锁,耗费资源,降低了程序的运行效率

同步方法

同步方法:将synchronized关键字加到方法上

  • 格式: 修饰符 synchronized 返回值类型 方法名(){ }

  • 同步方法的锁对象是this

同步静态方法,就是把synchronized关键字加到静态方法上

  • 格式: 修饰符 static synchronized 返回值类型 方法名(){ }

  • 同步静态方法的锁对象是 类名.class

代码示例


public class SellTicket implements Runnable {

//    private int tickets = 100;
   private static int tickets = 100;
   private Object object = new Object();
   private int x = 0;
   @Override
   public void run() {
       while (true) {
           if (x % 2 == 0) {
//                synchronized (object) {
//                synchronized (this) {
               synchronized (SellTicket.class) {
                   if (tickets > 0) {
                       try {
                           Thread.sleep(100);
                       } catch (InterruptedException e) {

e.printStackTrace();

}                        System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
                       tickets--;
                   }
               }
           } else {
//                synchronized (object) {
//                    if (tickets > 0) {
//                        try {
//                            Thread.sleep(100);
//                        } catch (InterruptedException e) {
//                            e.printStackTrace();
//                        }
//                        System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
//                        tickets--;
//                    }
//                }
               sellTicket();
           }
           x++;
       }
   }
//    private void sellTicket(){
//        synchronized (object) {
//            if (tickets > 0) {
//                try {
//                    Thread.sleep(100);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
//                tickets--;
//            }
//        }
//    }
//    private synchronized void sellTicket(){
//            if (tickets > 0) {
//                try {
//                    Thread.sleep(100);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
//                tickets--;
//            }
   private static synchronized void sellTicket(){
       if (tickets > 0) {
           try {
               Thread.sleep(100);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
           System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
           tickets--;
       }
   }
   public static void main(String[] args) {
       SellTicket sellTicket = new SellTicket();
       Thread thread1 = new Thread(sellTicket, "窗口1");
       Thread thread2 = new Thread(sellTicket, "窗口2");
       Thread thread3 = new Thread(sellTicket, "窗口3");
       thread1.start();
       thread2.start();
       thread3.start();
   }
}

lock锁

lock实现提供比使用synchronized方法和语句可获得更广泛的操作

  • void lock()获得锁

  • void unlock()释放

lock是接口不能直接实例化,采用实现类实例化ReentrantLock


import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class SellTicket implements Runnable {
   private int tickets = 100;
   private Object object = new Object();
   private Lock lock = new ReentrantLock();
   @Override
   public void run() {
       while (true) {
          try {
               lock.lock();
               if (tickets > 0) {
                   try {
                       Thread.sleep(100);

} catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
                   tickets--;
               }
           } finally {
               lock.unlock();
           }
       }
   }
   public static void main(String[] args) {
       SellTicket sellTicket = new SellTicket();
       Thread thread1 = new Thread(sellTicket, "窗口1");
       Thread thread2 = new Thread(sellTicket, "窗口2");
       Thread thread3 = new Thread(sellTicket, "窗口3");
       thread1.start();
       thread2.start();
       thread3.start();
   }

来源:https://www.cnblogs.com/testero/p/15135598.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com