Java 用objective c实现螺纹锁紧

Java 用objective c实现螺纹锁紧,java,objective-c,multithreading,locking,Java,Objective C,Multithreading,Locking,我正在用最新的SDK开发iOS5及以上版本 我必须在Objective C中实现一个带有线程锁的同步方法 这是我必须做的Java版本: public abstract class MyClass { [ ... ] private static Object dataLock = new Object(); public static long dataId = 0; [ ... ] public static void PostData(byt

我正在用最新的SDK开发iOS5及以上版本

我必须在Objective C中实现一个带有
线程锁的同步方法

这是我必须做的Java版本:

public abstract class MyClass 
{
    [ ... ]

    private static Object dataLock = new Object();

    public static long dataId = 0;

    [ ... ]

    public static void PostData(byte[] data)
    {
        synchronized (MyClass.getDataLock())
        {
            dataId++;
            MyClass.getDataLock().notify();
        }
    }

    public static byte[] GetData()
    {
        synchronized (MyClass.getDataLock())
        {
            try
            {
                MyClass.getDataLock().wait();
            }
            catch (InterruptedException ex)
            {}

            return MyClass.getData();
        }
    }

    [ ... ]
}
如何在目标C中实现
数据锁
?作为
NSObject


如何在Objective C中执行
PostData
GetData
方法?
您可以使用@synchronized(dataLock){…code here…},但这不是所描述的最快的方法。

您可以使用@synchronized(dataLock){…code here…}但这不是所描述的最快的方法。

使用
NSCondition
类。例如:

static NSCondition* g_dataLock = nil;

...

+ (void)initialize
{
    if (self == [MyClass class])
    {
        g_dataLock = [NSCondition new];
    }
}

+ (void)postData:(NSData*)data
{
    [g_dataLock lock];
    dataId++;
    [g_dataLock signal];
    [g_dataLock unlock];
}

+ (NSData*)getData
{
    NSData* data = nil;

    [g_dataLock lock];
    [g_dataLock wait];

    data = ...

    [g_dataLock unlock];

    return data;
}

有关更多信息,请参阅

使用
NSCondition
类。例如:

static NSCondition* g_dataLock = nil;

...

+ (void)initialize
{
    if (self == [MyClass class])
    {
        g_dataLock = [NSCondition new];
    }
}

+ (void)postData:(NSData*)data
{
    [g_dataLock lock];
    dataId++;
    [g_dataLock signal];
    [g_dataLock unlock];
}

+ (NSData*)getData
{
    NSData* data = nil;

    [g_dataLock lock];
    [g_dataLock wait];

    data = ...

    [g_dataLock unlock];

    return data;
}

有关更多信息,请参阅

谢谢你的回答。如何在目标C中实现
dataLock
?作为一个
NSObject
?您可以在.m文件的顶部添加类似static const NSString*syncString=@“Synchronize”的内容,并在其上进行同步,或者只在自身上进行同步。类中可能不需要有dataLock对象,这只是一段代码。在
MyClass
上有六个或七个锁。谢谢你的回答。谢谢你的回答。如何在目标C中实现
dataLock
?作为一个
NSObject
?您可以在.m文件的顶部添加类似static const NSString*syncString=@“Synchronize”的内容,并在其上进行同步,或者只在自身上进行同步。类中可能不需要有dataLock对象,这只是一段代码。在
MyClass
上有六个或七个锁。谢谢你的回答。谢谢投票结束,不要说为什么。谢谢投票结束,不要说为什么。非常感谢你的回答。在您的回答中,您添加了此方法
+(void)initialize
,但是,它是否与
抽象类
兼容?我知道
Objective C
没有
abstract
类,但我想尝试在Objective C上创建类似的东西。@VansFannel由于您的Java代码使用静态方法,所以我在示例中使用了Obj-C类方法+initialize是一个类方法,在第一次使用类之前,每个类只调用一次。该方法通常用于执行任何类级初始化,如示例中的数据锁。因此,如果我使用
+initialize
我不需要使用类方法,不是吗?谢谢。这只是一种可以用来初始化全局数据的方法。非常感谢您的回答。在您的回答中,您添加了此方法
+(void)initialize
,但是,它是否与
抽象类
兼容?我知道
Objective C
没有
abstract
类,但我想尝试在Objective C上创建类似的东西。@VansFannel由于您的Java代码使用静态方法,所以我在示例中使用了Obj-C类方法+initialize是一个类方法,在第一次使用类之前,每个类只调用一次。该方法通常用于执行任何类级初始化,如示例中的数据锁。因此,如果我使用
+initialize
我不需要使用类方法,不是吗?谢谢。这只是一种可以用来初始化全局数据的方法。