JAVA中本机方法与同步关键字

本地,同步[@more@]

JAVA中本机方法
@与羊共舞的狼

JAVA不是完美的,JAVA的不足除了体现在运行速度上要比传统的c++慢许多之外,JAVA无法直接访问到操

作系统底层(如系统硬件等),为使此JAVA用本机方法来扩展JAVA程序的功能。
可以将本机方法比作JAVA程序同C程序的接口,其实现步骤:
1,在JAVA中声明本地()方法,然后编译,
2,用javah产生一个。h文件;
3,写一个. cpp文件实现本地导出方法,其中需要包含第二步产生的. h文件(注意其中又包含了

JDK带的jni。h文件);
4,将第三步的。cpp文件编译成动态链接库文件;
5,在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个本地()方法就

可以在Java中被访问了。

Java本地方法适用的情况1。为了使用底层的主机平台的某个特性,而这个特性不能通过JAVA API访问

2。为了访问一个老的系统或者使用一个已有的库,而这个系统或这个库不是用JAVA编写的

3。为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。

首先写好JAVA文件
/*
*创建:Inner.m4t2 ()=" + i);
尝试{
thread . sleep (500);
}捕捉(InterruptedException ie) {
}
}
}
}
私人空m4t1(内部内部){
同步(内部){//使用对象锁
inner.m4t1 ();
}
}
私人空间m4t2(内部内部){
inner.m4t2 ();
}
公共静态void main (String [] args) {
最后Thread3 myt3=new Thread3 ();
最后内心内心=myt3。新的内部();
线程t1=新线程(
新Runnable () {
公共空运行(){
myt3.m4t1(内部);
}
},“t1”
);
线程t2=新线程(
新Runnable () {
公共空运行(){
myt3.m4t2(内部);
}
},“t2”
);
t1.start ();
t2.start ();
}
}

结果:

尽管线程t1获得了对内在的对象锁,但由于线程t2访问的是同一个内心中的非同步部分,所以两个线程

互不干扰。

t1: Inner.m4t1 ()=4
t2: Inner.m4t2 ()=4
t1: Inner.m4t1 ()=3
t2: Inner.m4t2 ()=3
t1: Inner.m4t1 ()=2
t2: Inner.m4t2 ()=2
t1: Inner.m4t1 ()=1
t2: Inner.m4t2 ()=1
t1: Inner.m4t1 ()=0
t2: Inner.m4t2 ()=0

现在在Inner.m4t2()前面加上同步:

私人同步空白m4t2 () {
int i=5;
, (i - -> 0) {
System.out.println (Thread.currentThread () . getname () +”: Inner.m4t2 ()=" + i);
尝试{
thread . sleep (500);
}捕捉(InterruptedException ie) {
}
}
}

结果:

尽管线程t1与t2访问了同一个内心对象中两个毫不相关的部分,但因为t1先获得了对内在的对象锁,所

以t2对Inner.m4t2()的访问也被阻塞,因为m4t2()是内心中的一个同步方法。

t1: Inner.m4t1 ()=4
t1: Inner.m4t1 ()=3
t1: Inner.m4t1 ()=2
t1: Inner.m4t1 ()=1
t1: Inner.m4t1 ()=0
t2: Inner.m4t2 ()=4
t2: Inner.m4t2 ()=3
t2: Inner.m4t2 ()=2
t2: Inner.m4t2 ()=1
t2: Inner.m4t2 ()=0


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

2 . Java线程及同步(同步)样例代码

进口. io . *;
进口java.util。*;
进口java.text.SimpleDateFormat;

公共类TestThread延伸线
{
私有静态整数threadCounterLock;//用于同步,防止数据被写乱
私有静态int threadCount;//本类的线程计数器

静态
{
threadCount=0;
threadCounterLock=新的整数(0);
}

公共TestThread ()
{
超级();
}

公共同步静态孔隙incThreadCount ()
{
threadCount + +;
system . out。println(“进入后线程数:”+ threadCount);
}

公共同步静态空decThreadCount ()
{
threadCount,
system . out。println(“离开后线程数:”+ threadCount);
}

公共空运行()
{
同步(threadCounterLock)//同步
{
threadCount + +;
system . out。println(“进入后线程数:”+ threadCount);
}

//incThreadCount ();//和上面的语句块是等价的

最后长nSleepMilliSecs=1000;//循环中的休眠时间

长nCurrentTime=System.currentTimeMillis ();
长nEndTime=nCurrentTime + 30000;//运行截止时间
SimpleDateFormat SimpleDateFormat=new SimpleDateFormat (yyyy-MM-dd HH: mm: ss);


{
尝试而(nCurrentTime {
nCurrentTime=System.currentTimeMillis ();
system . out。println(“线程”+ this.hashCode() +“当前时间:”+

simpleDateFormat。格式(新日期(nCurrentTime)));

尝试
{
睡眠(nSleepMilliSecs);

JAVA中本机方法与同步关键字