java-线程的同步机制

java-线程的同步机制:

本案例因为是两个不同的线程(一个为写人线程,一个为读取线程)所有在大量数据运行的时候很可能存在数据不同步现象,举个例子:比如你现在写入一部分数据,我在你没有写完的时候就拿去用,这样的数据很明显不全。我的另外一个案例介绍了如何避免这种情况。转跳另一种

package com.etc.xiancheng.xctongbujizhi;

/**
 * 密钥 Key: 一个16字节的数组;
 * 密钥的完整性:密钥的16字节必须相同;
 * 两个线程同时访问一个对象的时候,可能发生数据不同步的现象。
 */
public class Key {

    private byte[] data = new byte[16];

    public Key() {
        update((byte) 0);
    }

    // 更新密钥
    public void update(byte seed) {
        for (int i = 0; i < data.length; i++) {
            data[i] = seed;

            // 是的密钥跟新速度变慢
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {

            }
        }
    }
    // 获取密钥
    public byte[] get() {
        return data;
    }
}

package com.etc.xiancheng.xctongbujizhi;

/**
 * 实现多线程对同一个对像的同步访问,且一个读有一个写,容易发生不同步现象
 * 则需要线程同步,引入互斥锁的概念:
 * 1.若别的线程正持有该锁,则本线程阻塞等待。
 * 2.若此锁空闲,则本线程持有锁(locked),进入大括执行,完毕之后释放锁。
 * <p>
 * 线程同步:就是让两个线程步调一致,有序地访问的同一对象。
 */
public class KeyTest {

    // 定期更新密钥
    private class KeyUpdater extends Thread {

        private Key key;

        public KeyUpdater(Key k) {
            this.key = k;
        }

        public void run() {
            byte seed = 0;
            while (true) {

                // 更新密钥,每次加1
                synchronized (key) {
                    seed++;
                    if (seed > 100) seed = 0;
                    key.update(seed);
                }
                try {
                    Thread.sleep(5);
                } catch (InterruptedException e) {

                }
            }
        }

    }


    //  定期读取密钥
    private class KeyPrinter extends Thread {

        private Key key;

        public KeyPrinter(Key k) {
            this.key = k;
        }

        public void run() {
            byte seed = 0;
            while (true) {

                //  互斥锁
                synchronized (key) {

                    // 得到key 值并打印
                    byte[] data = key.get();
                    for (int i = 0; i < data.length; i++)
                        System.out.print(String.format("%02X", data[i]));
                    System.out.print("n");
                }

                try {
                    Thread.sleep(5);
                } catch (InterruptedException e) {

                }

            }
        }
    }


    public void test() {

        Key key = new Key();
        KeyUpdater t1 = new KeyUpdater(key);
        KeyPrinter t2 = new KeyPrinter(key);

        t1.start();
        t2.start();
    }


    public static void main(String[] args) {
        KeyTest k1 = new KeyTest();
        k1.test();
    }
}

匿名

发表评论

匿名网友