多线程11_张孝祥 java5的线程锁技术

本例子因为两个线程公用同线程中,使用同一个对象,实现了他们公用一把锁,实现了同一个方法的互斥。

package locks;

/**
 *会被打乱的效果
 */
public class LockTest2 {

    public static void main(String[] args) {
        new LockTest2().init();
    }

    private void init() {
        //两个线程同时使用同一个Outputer对象,来确保他们使用的是同一把锁
        final Outputer outputer = new Outputer();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //启动一个线程  调用方法  打印如下代码
                    outputer.output("zhangxiaoxiang");
                }

            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //在启动一个线程 调用方法   打印  如下代码
                    outputer.output("lileilei");
                }

            }
        }).start();
    }
    // 两个线程调用方法的过程中,不能彼此干扰

    class Outputer {

        public void output(String name) {

            try {
                int len = name.length();
                for (int i = 0; i < len; i++) {
                    System.out.print(name.charAt(i));
                }
                System.out.println();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

//红色区域是发生打乱的效果
//iaoxiang
//zhangxiaoxiang
//lileilei
//zhangxiaoxialnig
//leilei
//lzihangxiaoxianlg
//eilei
//lilezhaniglxeii
//aoxiang
//zhangxiaoxianglileilei
//
//zhangxiaoxiang
//lileilei
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//zhlileilei
//angxiaoxiang
//lileilei
//zhangxiaoxiang
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiangli
//leilei
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//zhangxiaoxiang
//lileilei
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
//zhangxiaoxiang
//lileilei
//lileizhangxiaoxiang
//lei
//zhangxiaoxiang
//lileilei
//zhangxiaoxiang
package locks;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
 *不会被打乱的效果
 */
public class LockTest {

    public static void main(String[] args) {
        new LockTest().init();
    }

    private void init() {
        //两个线程同时使用同一个Outputer对象,来确保他们使用的是同一把锁
        final Outputer outputer = new Outputer();
        // 两个线程调用同一个方法的过程中,不能彼此干扰
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //启动一个线程  调用方法  打印如下代码
                    outputer.output("zhangxiaoxiang");
                }

            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //在启动一个线程 调用方法   打印  如下代码
                    outputer.output("lileilei");
                }

            }
        }).start();
    }

    class Outputer {

        Lock lock=new ReentrantLock();
        //通过锁,可以确保同一时间只有一个线程可以调用此方法
        public void output(String name) {

            // 当A线程进入此方法的时候, 如果B也进来,发现A占用次锁, B需要等待该锁被释放才能继续往下执行,
            lock.lock();//加一把所
            System.out.print(Thread.currentThread().getName()+"  ");
            try {
                int len = name.length();
                for (int i = 0; i < len; i++) {
                    System.out.print(name.charAt(i));
                }
                System.out.println();
            } catch (Exception e) {
                e.printStackTrace();
            }finally{

                lock.unlock();//解锁
            }
        }
    }
}
//不被打乱的效果
//lileilei
//zhangxiaoxiang
//zhangxiaoxiang
//lileilei
//lileilei
//zhangxiaoxiang
//zhangxiaoxiang
//lileilei
//lileilei
//zhangxiaoxiang
//lileilei
时间: 2024-10-10 07:58:00

多线程11_张孝祥 java5的线程锁技术的相关文章

11.Java5的线程锁技术

1 import java.util.concurrent.locks.Lock; 2 import java.util.concurrent.locks.ReentrantLock; 3 4 5 /** 6 * java5的线程锁技术 7 * Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似. 8 * 锁本身也应该是一个对象.两个线程执行的代码片段要实现同步互斥的效果,它们必须 9 * 用在同一个Lock对象.锁是上在代表要操作的资源的类的内部方法中,而不是

Android多线程研究(9)——线程锁Lock

在前面我们在解决线程同步问题的时候使用了synchronized关键字,今天我们来看看Java 5.0以后提供的线程锁Lock. Lock接口的实现类提供了比使用synchronized关键字更加灵活和广泛的锁定对象操作,而且是以面向对象的方式进行对象加锁. @Override public void run() { while(true){ Lock lock = new ReentrantLock(); try { lock.lock(); Thread.sleep(new Random()

多线程操作数据拷贝要加线程锁

debug三天之后,在今天终于发现了自己开的两个线程(一个接收数据,一个处理数据)所处理的数据并不相等.用compare比较后发现数据有所偏差,处理线程的数据存成文件之后隔一段都要比接收线程少一点.少的频率跟线程之间的切换次数又有关系,这就让人直接怀疑是不是内存拷贝发生了错误,结果查了所有的语句都没发现问题,最后突然想到多线程在数据拷贝的过程中一旦遇到线程切换会导致不确定的因素发生,于是在线程拷贝数据的地方加上线程锁,bug解决!多线程操作数据拷贝要加线程锁,布布扣,bubuko.com

【java并发】线程锁技术的使用

线程锁好比传统线程模型中的synchronized技术,但是比sychronized方式更加面向对象,与生活中的锁类似,锁本身也应该是个对象.两个线程执行的代码片段如果要实现同步互斥的效果,它们必须用同一个锁对象.锁是上在代表要操作的资源的类的内部方法中,而不是线程代码中.这一篇博文主要总结一下线程锁技术中Lock锁.ReadWriteLock锁的使用. 1. Lock的简单使用 有了synchronized的基础,Lock就比较简单了,首先看一个实例: public class LockTes

iOS 多线程 NSThread NSOperation NSOperationQueue GCD 线程锁 线程阻塞

iPhone中的线程应用并不是无节制的,官方给出的资料显示,iPhone OS下的主线程的堆栈大小是1M,第二个线程开始就是512KB,并且该值不能通过编译器开关或线程API函数来更改,只有主线程有直接修改UI的能力,所以一些数据层面可以开辟线程来操作进行,iOS线程的操作方法有NSThread NSOperation NSOperationQueue GCD: NSThread方法有 //NSThread自动 - (IBAction)didClickNSThreadAutoButtonActi

JDK5什么是新的线程锁技术(两)

一个. Lock线程同步实现互斥 Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也是一个对象. 两个线程运行的代码片段要实现同步相互排斥的效果.他们必须用同一个Lock对象.锁是上在代表要操作的资源的类的内部方法中, 而不是线程代码中. public class LockTest { public static void main(String[] args) { new LockTest().init(); } private void init(

JDK5新特性之线程锁技术(二)

一. Lock实现线程同步互斥 Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也是一个对象. 两个线程执行的代码片段要实现同步互斥的效果,他们必须用同一个Lock对象.锁是上在代表要操作的资源的类的内部方法中, 而不是线程代码中. public class LockTest { public static void main(String[] args) { new LockTest().init(); } private void init() {

iOS开发多线程篇---线程锁(线程安全)

@interface BTThreadViewController () {     NSThread *OneThread;//师傅一     NSThread *TwoThread;//师傅二     NSThread *ThreeThread;//师傅三     int allCake;//蛋糕总数 } @end @implementation BTThreadViewController - (id)initWithNibName:(NSString *)nibNameOrNil bun

JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序员杜鹏程的博客:http://blog.csdn.net/m366917 我们来继续学习多线程 Lock锁的使用 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock Lock void lock():获取锁 v