`
文章列表
一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。 使用:Semaphore available = new Semaphore(3); 创建了只能三个线程访问的信号量 获得许可:available.acquire(); 释放许可:available.release(); 这两句代码放到操作的数据对象当中,只维护可以有几个线程同时访问程序代 ...
第一种情况:就使用单个Condition对象实现通信,方式同wait()和notify() condition是await()和signal(),其中condition对象是通过lock.getCondition()获得的; 第二种情况:实现多路通信 下面是一个例子,来自于API中的Condition类,此例子实 ...
读写锁是线程读写同一文件所需要用到的,读写锁是什么东西在这里不做过多的解释,可以自己去百度或谷歌去搜一下。 谨在此附上我自己写的缓存系统的简单实现,你从中也能悟出缓存实现的基本思想 缓存里面有数据就从缓存中取,没有就给你从其他地方得到。 package cn.com.scl.cache import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWrit ...
java中还提供了可以返回值的线程池,例子如下: import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class CallableAndFuture { /** * @param args ...
线程池是java5之后新增的功能,使用呢线程池也至少是java5的jdk。 什么是线程池呢,就先准备好若干个线程等待执行任务,只要任务来了,存放线程的容器就是线程池,然后从池子拿出一个线程来让这个线程进行服务。 好处是 ...
多个线程对共同数据的访问的实现,要根据情况而定 (1)当访问共同的代码的时候:可以使用同一个Runnable对象,这个Runnable对象中有这个共享数据,比如卖票系统就可以这么做。或者这个共享数据封装在一个对象当中,然后对这个对象加锁,也可以实现数据安全访问。 (2)当各个线程访问的代码不同时:这时候要使用不同的Runnable对象,有两种实现方式: a)将共享数据封装在另一个对象当中,然后将这个对象逐一的转递给各个Runnable对象。操作数据的方法也放进这个对象当中。这样容易实现各个线程对这个数据的同步和共享。 b)将Runnable对象作为某一个类中的内部类,共享数据作为这个 ...
ThreadLocal的作用和目的:用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另一个线程中则共享另一份数据,线程的数据是独享的。 ThreadLocal的实现原理:每个线程调用全局ThreadLocal的set方法,就相当于往其内部的Map中增加一条记录,key是各自的线程,value是各自的线程调用set放进的值。在线程结束时可以调用ThreadLocal.clear()方法,可以立即释放内存。也可以不调用,线程运行完成之后内存也会被回收。 ThreadLocal的应用场景: (1)订单处理 (2)银行转账等 Struts2中 ...
线程范围内的共享变量,每个线程只能访问他自己的,不能访问别的线程的。 下面请看一个不安全的例子,这个例子中的data数据有安全问题,可以测试一下 import java.util.Random; public class ThreadScopeShareData { public static int data; /** * @param args */ public static void main(String[] args) { for(int i=0;i<2;i++){ new Thread(new Runnable(){ ...
有一个使用共同数据的经验:要用到共同数据(包括同步锁)的若干方法,要放到同一个类里。体现了程序的高内聚,也增强了程序的健壮性。 还有一个经验,把同步代码或在和锁放到共同使用的数据上,而不是放在线程内,这样的好处是什么呢:首先是更符合面向对象的思想。其次是这种设计结构非常容易实现线程的同步,并且增加线程访问共同数据的时候不用每次都在线程内增加同步代码。有利于扩展和维护。 首先看一个例子,子线程先循环10次,主线程再循环100次,接着子线程循环10次,主线程再循环100次,如此循环往复50次; 实现代码如下: public class TraditionalThreadConnec ...
对面向对象的理解可能每个人的理解程度不一样,这样就导致了写的程序的差别很大,写的质量上也回差别很大。 <<Thinking In Java>>中说的好,Everything is object.每个事物都可以被看成对象,都可以被抽象成对象。 怎么抽象对象呢? 请记住一个原则,那就是:谁拥有数据,谁向外提供操作数据的方法。记住这个原则抽象对象就迎刃而解了。 比如,你用手机打电话,是谁拨的电话呢?不明白面向对象编程的人会认为是“你”,但是用面向对象的方式去理解的话就是,拨电话这个行为是手机的行为,你只是调用他的拨电话方法而已。 有什么不妥的地方敬请指正。
线程安全问题是一个比较高深的问题,是很多程序员比较难掌握的一个技术难点,如果一个程序员对线程掌握的很好的话,那么这个程序员的内功修炼的是相当的好。 在这里我主要说一下我对java中如何保证线程安全的一些个人见解,希望对各位有所帮助,那里有不对的地方敬请给位不吝赐教。 线程安全问题主要出现在访问临界资源的时候,就是访问同一个对象的时候,可能会出现无法挽回的损失,特别是在关于资金安全方面的时候,当然还有数据库事务方面的问题。他们很类似,都是要保证数据的原子性。 那么在java中如何保证线程安全呢? 对与共同使用的对象进行加锁,意思是我使用的时候,那么你就必须等待,等我用完之后你再用,反之 ...
 定时器,就是五分中之后没有对程序进行操作,让程序自动退出。 现在写一下几个常用的方式,就以定时为例 1,两秒之后爆炸 //定义一个两秒之后的定时器,两秒之后爆炸 Timer timer1 = new Timer(); timer1.schedule(new TimerTask(){ @Override public void run() { System.out.println("爆炸..."); } }, 2000); 2.两秒之后一个爆炸,以后是每个一秒爆炸一次,连环爆炸 //两秒之后第一个爆炸,之后每隔一秒爆炸一次 Timer timer2 ...
下面是两种传统的java创建线程的方法,什么是线程呢,就是在进程中在开出一点空间,同时运行另一个线索,或者叫另一个任务 public class TraditionalThread { /** * @param args */ public static void main(String[] args) { //第一种创建线程的方法 Thread t1 = new Thread(){ public void run(){ System.out.println("t1--"+Thread.currentThread().getName()); } }; ...

JNI

JNI是Java Native Interface的缩写。 从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分, 它允许Java代码和其他语言写的代码进行交互。 JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。 使用java与本地已编译的代码交互,通常会丧失平台可移植性。 但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互, 或者为了提高程序 的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。 ...
权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统。 很多人,常将“用户身份认证”、“密码加密”、“系统管理”等概念与权限管理概念混淆。 目录 一,权限管理场景举例 二,权限管理分类 三,容易混淆的概念 四,权限管理技术实现
Global site tag (gtag.js) - Google Analytics