A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宏博 中级黑马   /  2017-7-21 11:07  /  802 人查看  /  2 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

给线程加锁的目的是为了保证线程的的安全,如在银行系统中,我们加锁可以保证数据的安全,如果没锁,两个线程同时对一个账号存取款各1000,那么这个账户的资金就有可能多1000或者少1000,这些想相信各个朋友都知道。我们给代码块加锁就要加一个object对象,,他是同步代码的关键,在执行同步代码块的时候首先要检查锁对象的标志位,如果为1,则执行代码,并把标志位置0,如果标志位为0,则进入阻塞状态。但是定义了一个线程类,里面定义了一个锁对象,也就说每创建一个线程对象就会创建一个锁对象,这么多锁对象为什么还能实现线程锁的目的呢?

2 个回复

倒序浏览
本帖最后由 宏博 于 2017-7-26 13:36 编辑

是我理解错了。可能是这样用,和大家分享下。如果两个线程要执行一个类中的synchronized(同步)方法,两个线程使用相同的实例来调用方法,那么一次只能有一个线程能够执行方法,另一个需要等待,直到锁被释放。也就是说:如果一个线程在对象上获得一个锁,就没有任何其他线程可以进入(该对象的)类中的任何一个同步方法.
回复 使用道具 举报
public class CopyOfThreadSafeTest implements Runnable {
    int num = 10; // 定义总票数

    public void run() {
        while (true) {
            synchronized ("") { // 定义同步块
                if (num > 0) { // 如果总票数大于0
                    try {
                        Thread.sleep(1000); // 线程休眠
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    System.out.println("剩余票数为:" + --num); // 输出提示信息
                }
            }
        }
    }

    public static void main(String[] args) {
        CopyOfThreadSafeTest t = new CopyOfThreadSafeTest(); // 定义本类对象
        Thread tA = new Thread(t); // 定义线程对象
        Thread tB = new Thread(t);
        Thread tC = new Thread(t);
        Thread tD = new Thread(t);
        tA.start(); // 驱动线程
        tB.start();
        tC.start();
        tD.start();
    }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马