美文网首页
线程和锁(一)

线程和锁(一)

作者: Cocoonshu粽子 | 来源:发表于2017-06-12 22:44 被阅读27次

互斥和内存模型

互斥是啥?互斥是用锁保证某一时间仅有一个线程可以访问数据。

创建线程
public class ThreadDemo {
    public static void main(String args[]) throws InterruptedException {
        Thread thread = new Thread(){
            @Override
            public void run() {
               System.out.println("Hello new thread !");
            }
        };
        thread.start();
        //通知调度器:当前线程想要让出对处理器的占用。
        Thread.yield();
        //Thread.sleep();
        System.out.println("Hello main thread !");
        thread.join();
    }
}

上面程序运用的结果有两种情况:

Hello new thread !
Hello main thread !
或者
Hello main thread !
Hello new thread !

Thread.yield()和Thread.sleep(long millis)区别
Thread.yield()是暂停当前正在执行的线程对象,并执行其他线程(这里的线程包括当前线程),也就是说虽然暂停了当前线程,下一个时间片仍然可能执行刚刚暂停的线程;
Thread.sleep(long millis) 是暂停当前线程millis所指定的毫秒,转到执行其他线程;

第一把锁

当多个线程共享一块内存时,会导致读写内存数据混乱,为了解决这样的混乱,我们可以用锁达到线程互斥的目的,即同一时间至多有一个线程持有锁。

public class Counting {
    public static void main(String args[]) throws InterruptedException {
        class Counter{
            private int count = 0;
            public void increment(){
                ++count;
            }
            public int getCount(){
                return count;
            }
        }

        final Counter counter = new Counter();

        class CountingThread extends Thread{
            @Override
            public void run() {
                for (int i =0;i<10000;++i){
                    counter.increment();
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

        CountingThread countingThreadOne = new CountingThread();
        CountingThread countingThreadTwo = new CountingThread();

        countingThreadOne.start();
        countingThreadTwo.start();
        countingThreadOne.join();
        countingThreadTwo.join();

        System.out.println("Count value:"+counter.getCount());
    }
}

我们会认为结果是20000,但是真的是20000吗?,运用之后显示出乎预料,为什么会出现不是20000的问题呢,问题就出在++count 上,++count 并不是原子操作;
原子操作:所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。

相关文章

  • 线程和锁(一)

    互斥和内存模型 互斥是啥?互斥是用锁保证某一时间仅有一个线程可以访问数据。 创建线程 上面程序运用的结果有两种情况...

  • 自旋锁

    讲自旋锁之前了解互斥锁一个锁一次只能由一个线程持有,其它线程则无法获得,除非已持有锁的线程释放了该锁。 互斥锁和自...

  • Java并发那些事儿-锁

    公平锁和非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁,线程直接进入队列中排队,队列中的第一个线程才能获得锁...

  • Java锁有哪些种类

    一 公平锁和非公平锁 公平锁:多个线程按照申请锁的顺序来获取锁 非公平锁:多个线程获取锁的顺序并不是按照申请锁的顺...

  • 悲观锁:一个线程得到锁,其它线程挂起,synchronized 乐观锁:一个线程得到锁,其它线程不断重试, cas...

  • Java并发编程-CAS与非阻塞算法

    一. 锁的弊端 频繁的线程挂起和恢复 当多个线程发生锁竞争时, 那些没有获取锁的线程可能会被挂起并在稍后恢复执行...

  • java并发基础-各种锁和ThreadLocal

    概念 独占锁和共享锁 独占锁:一种悲观锁,任何时候都只能有一个线程得到锁共享锁:一种乐观锁,可以由多个线程持有,比...

  • 读写锁

    头文件:#include 读写锁分为读锁和写锁,规则如下: 1,如果某线程申请了读锁,其它线程可以再申请读锁,但不...

  • Python爬虫第六天:进程-线程安全-互斥锁-同步异步-队列-

    内容简述: 一:初始线程和进程 二:进程和线程的区别 三:线程的调用方式 四:线程安全与线程锁 ...

  • sleep,wait, join yield

    锁池:所有需要竞争同步锁的线程都会放在锁池中,当一个线程得到锁后,其他线程都会在锁池中等待,当线程释放锁之后,其他...

网友评论

      本文标题:线程和锁(一)

      本文链接:https://www.haomeiwen.com/subject/qnnlqxtx.html