`
interzz
  • 浏览: 9889 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论
文章列表
我们知道volatile修饰的变量可以实现基本的加载和赋值的原子性,但是对于像i++等操作就不能保证原子性了,在JDK1.5之前我们只能通过synchronized(阻塞的方式)实现这些复合操作的原子性,在JDK1.5中java.util.concurrent.atomic 包提供了若干个类能实现对int,long,boolean,reference的几个特殊方法非阻塞原子性,这一系列类的主要基于以下两点 1.volatile修饰变量,保证get()/set()的原子性 2.利用系统底层的CAS原语来实现非阻塞的其它方法原子操作   compareAndSwap(memorylocation, ...
为了控制多个线程按照正确的顺序来访问共享数据,Java提供了提供了两种锁方案 1.隐式锁(Synchronized)   这一种就是比较大家熟悉的synchronized关键字,因为Java中每个对象都实现了lock的功能,所以synchronized正是利用了这一特性,来控制并发访问.使用synchronized关键字可以保证使用同一个锁的方法或代码块在不同的线程里执行时是原子的即不可分割的(Atomic),这是通过阻塞(blocking)的方式来实现原子性,后面的文章会提到非阻塞(non-blocking)的方式实现原子操作.       public synchronized voi ...
为什么基于多线程的程序会出现同步问题,根源在于多个程序之间会共享数据,没有数据共享的或只共享只读数据的多线程程序是不需要去考虑同步的.而现实中这样的状态比较少见,常见的多线程都会读写共享数据,基于此,就需要对涉及到共享数据操作的方法进行同步,何为同步就是依靠一定的机制让线程按照次序来操作数据,防止出现读脏数据等情况出现.类似常见的存取款程序,必须严格控制账户这个共享信息的访问次序. 所以要正确的编写多线程程序,控制共享数据的同步就成了最核心的问题,因为CPU的控制权是针对线程来分时的,所以各个线程的执行次序是不可预知的.所以采用lock来实现对共享数据的独占成为解决同步问题的一个普遍做法. ...
1.isAlive()    线程已经调用了start方法且没有结束    返回true时,线程对应于Runnable,Waiting,Timed_Waiting,Blocked四种State,不要以为 只是对应于Runnable状态    返回false时,线程对应于New,Terminated两种状态    2.isInterrupted()   线程是否interru ...

Java线程的状态

 
Java虚拟机中线程的状态可以为且同时只能为以下6种之一,这些状态只是JVM定义的线程状态,不代表任何操作系统的线程状态. 1.NEW   线程被创建了,但没有调用start()方法    Thread t = new TestThread(); //创建线程,此时处于NEW状态 2.RUNNABLE    线程处于(可)运行状态,但也可能在等待CPU等资源    或者等待IO,比如socket的等待数据流       3.BLOCKED        线程处于等待某个锁的状态 4.WAITING         当线程调用一下方法之一后进入WAITING状态     ...

Wait 和 Notify

wait,notify,notifyAll 是Object的方法,用于线程间(确切的讲是需要使用同一个锁的线程间)的通信.只有该对象锁的owner线程才可以调用这几个方法,否则会抛出异常. 1.wait() ,wait(sometime)   该方法会使当前线程释放已经获得的锁,进入对该 ...
Global site tag (gtag.js) - Google Analytics